目录
5. 使用 Redis 的 Java API 客户端——Jedis
1. Redis 基本概念
Remote Dictionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的开源的、高性能的、使用 ANSI C 语言编写的、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 存储系统,并提供多种语言的 API。
和 memcached 类似,Redis 常被称作是一款 Key-Value 内存存储系统或者内存数据库,同时由于它支持丰富的数据结构,又被称为一种数据结构服务器(Data Structure Server),因为其值(Value)可以是字符串(String)、哈希(Map)、列表(List)、集合(Set)和有序集合(Sorted Set)等类型。
Redis 与其他 Key-Value 缓存产品有如下三个特点:
1. Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
2. Redis 不仅仅支持简单的 Key-Value 类型的数据,同时还提供 List, Set, ZSet, Hash 等数据结构的存储
3. Redis 支持数据的备份,即 Master-Slave 模式的数据备份
2. Redis 的优势
1. 性能极高:Redis 读的速度可达 110000 次/s,写的速度可达 81000 次/s
2. 丰富的数据类型:Redis 支持二进制案例的 String, List, Hash, Set 以及 Sorted Set 数据类型的操作
3. 原子操作:Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作合并后的原子性执行
4. 丰富的特性:Redis 还支持 Publish/Subscribe,通知 Key 过期,支持高可用集群等特性
5. 数据持久化机制:持久化机制有两种:1)RDB 方式:定期将内存数据 dump 到磁盘 2)AOF(Append Only File) 持久化机制:用记日志的方式记录每一条数据更新操作,一旦出现灾难事件,可以通过日志重放来恢复整个数据库
3. Redis 适用场景
1. TopN 需求:取最新的 N 个数据,如读取作家博客最新的 50 篇文章,通过 List 实现对按时间排序的数据的高效读取
2. 排行榜应用:以特定条件为排序标准,将其设成 Sorted Set 的 score,进而实现高效获取
3. 需要精准设定过期时间的应用:把 Sorted Set 的 score 值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了
4. 计数器应用:Redis 的命令都是原子性的,可以轻松地利用 INCR, DECR 命令来构建计数器系统
5. 去除大量数据中的重复数据:将数据放入 Set 中,就能实现对重复数据的排除
6. 构建队列系统:使用 List 可以构建队列系统,使用 Sorted Set 甚至可以构建有优先级的队列系统
7. 实时系统、反垃圾系统:通过上面说到的 Set 功能,可以知道有一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等
8. Publish/Subscribe 构建实时消息系统
9. 缓存(会话、商品列表、评论列表、经常查询的数据等)
以一个某技术社区为例:
记录帖子的点赞数、评论数和点击数(Hash) |
记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表(ZSet) |
记录帖子的标题、摘要、作者和封面信息,用于列表页展示(Hash) |
记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数(ZSet) |
缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (Hash) |
记录帖子的相关文章 ID,根据内容推荐相关帖子(List) |
如果帖子 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器) |
收藏集和帖子之间的关系(ZSet) |
记录热榜帖子 ID 列表,总热榜和分类热榜(ZSet) |
缓存用户行为历史,进行恶意行为过滤(ZSet,Hash) |
4. Redis-3.2.6 安装(未整理)与测试
官网:https://redis.io/ 下载安装包
假设安装已完成
启动 Redis Server
redis-server
后台启动
nohup redis-server 1>~/data/redis/redis_std.log 2>~/data/redis/redis_err.log &
启动客户端执行命令
redis-cli
检测 Redis 是否正常工作
PING
5. 使用 Redis 的 Java API 客户端——Jedis
1. 新建一个 Maven 工程,导入如下依赖:
<dependency>
<groupId>redis.clients</groupId>
<artiFactId>jedis</artiFactId>
<version>2.9.0</version>
</dependency>
2. 编写一个测试类用来测试客户端是否可以访问服务器
package cn.gldwolf.jedis
import redis.clients.jedis.Jedis; \
public class JedisClientDriver {
public static void main(String[] args) {
// 创建一个 Jedis 客户端对象
Jedis client = new Jedis("hdp01", 6379);
// 测试服务器是否连通 String response = client.ping();
Sytstme.out.println(response); // 若能 ping 通,则会返回一个 PONG
}
}
6. 数据结构
6.1 String -- 字符串
6.1.1 String 使用概述
String 是 Redis 最基本的类型,可以理解成与 Memcached 一模一样的类型,一个 Key 对应一个 Value.
String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据,比如 jpg 图片或者序列化的对象。
String 类型是 Redis 最基本的数据类型,一个键最大能存储 512MB.
命令 |
介绍 |
SET key value |
设置值 |
SETNX key value |
如果 Key 存在,返回 0 且修改不生效 |
SETEX key seconds value |
指定有效期为 seconds 秒 |
SETRANGE key offset value |
将 Key 对应的 Value 第 n 位后面的字符替换成 value |
MSET key value [key value ...] |
一次设置多个值 |
MSETNX key value [key value ...] |
类似 SETNX,设置多个值,如果 Key 存在,则返回 0 且修改不生效 |
GET key |
获取 Key 对应的值 |
GETSET key value |
设置 Key 的值,并返回 Key 的旧值 |
GETRANGE key start end |
获取索引位置从 start 到 end 的 Key 对应值的字符串 |
MGET key [key ...] |
一次获取多个 Key 对应的值,如果不存在,则返回 nil |
INCR key |
对 Key 的值作 +1 操作,如果 INCR 一个不存在的值,则对 Key 赋值为 1,如果 Key 对应值不是 Int 类型,则返回错误:-ERR value is not an integer or out of range |
INCRBY key increment |
加指定值 increment,Key 不存在的时候会设置 Key,并认为原来的 Value 为 0 |
DECR key |
对 Key 的值作 -1 操作,DECR 一个不存在的 Key,则设置 Key 为 -1 |
DECRBY key decrement |
减指定值 |
APPEND key value |
将 value 追加到 Key 对应的值的末尾,返回新字符串的长度 |
STRLEN key |
读取 Key 对应的 value 的长度 |
6.1.2 String 常用操作
1. 插入和读取一条 String 类型的数据
2. 对 String 类型数据进行增减(前提是这条数据的 Value 可以看作数字)