Redis是时下流行的缓存中间件。
Redis是一个键值数据库,比如key是“1001”, value是{"id": "123", "name": "lisan"}. 因此Redis是没有类型约束的,可以存任何格式,是一种NoSql.
配置
brew install redis
前台运行redis:
redis-server
后台运行启动redis:
brew services start redis
redis配置文件的位置:
/usr/local/etc/redis.conf
Once Redis is running, you can test it by running redis-cli:
redis-cli
redis client非常全,常用的就有上面的cli客户端
配置完成后,可以试一下redis命令:
Step 1: 开一个terminal,输入redis-server来启动redis
Step 2: 开另一个terminal,输入redis-cli,用cli客户端操作redis
通过学习redis的数据类型,来熟悉相应的redis命令。例如String类型的操作:
Hash类型的操作:
Hash可以对对象中的每个字段单独存储,可以对某个字段做CRUD。
HSET rooling:user:3 age 21
HSET rooling:user:3 name wangli
HGET rooling:user:3 name
HGET rooling:user:3 age
HMSET rooling:user:4 name HanMei age 20 sex male
HGET rooling:user:4 sex
HMGET rooling:user:4 name age sex what
HGETALL rooling:user:4
HKEYS rooling:user:4
HINCRBY rooling:user:4 age 1
List类型的操作:
Redis中的List类型与Java中LinkedList类似,可以看作一个双向链表结构,既可以支持正向检索,也可以支持反向检索。特征:有序,元素可重复,插入和删除快,查询慢。常用来存储一个有序数据,例如朋友圈点赞列表,评论列表等。
127.0.0.1:6379> LPUSH rooling:like:1 mingming dawei zixun wangqiqi
(integer) 5
127.0.0.1:6379> LRANGE rooling:like:1 2 3
1) "dawei"
2) "mingming"
127.0.0.1:6379> BLPOP rooling:like:2 100
1) "rooling:like:2"
2) "someele"
(36.54s)
127.0.0.1:6379>
Set类型的操作:
Redis中的Set类型与Java中HashSet类似,可以看作一个value为null的HashMap。特征:无序,元素不可重复,查找快,支持交集,并集,差集等功能。适用于好友列表,共同好友等功能。
127.0.0.1:6379> SADD s1 a b c
(integer) 3
127.0.0.1:6379> SMEMBERS s1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SREM s1 a
(integer) 1
127.0.0.1:6379> SMEMBERS s1
1) "c"
2) "b"
127.0.0.1:6379> SISMEMBER s1 a
(integer) 0
127.0.0.1:6379> SISMEMBER s1 b
(integer) 1
127.0.0.1:6379> SADD s2 a b c d
(integer) 4
127.0.0.1:6379> SINTER s1 s2
1) "c"
2) "b"
127.0.0.1:6379> SDIFF s1 s2
(empty array)
127.0.0.1:6379> SUNION s1 s2
1) "d"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379>
zhangsan 和 lisi的好友列表差异:
127.0.0.1:6379> SADD zhangsan lisi wangwu zhaoliu
(integer) 3
127.0.0.1:6379> sadd lisi wangwu mazi ergou
(integer) 3
127.0.0.1:6379> scard zhangsan
(integer) 3
127.0.0.1:6379> sinter zhangsan lisi
1) "wangwu"
127.0.0.1:6379> sdiff zhangsan lisi
1) "lisi"
2) "zhaoliu"
127.0.0.1:6379> sunion zhangsan lisi
1) "lisi"
2) "zhaoliu"
3) "mazi"
4) "wangwu"
5) "ergou"
127.0.0.1:6379> sdiff lisi zhangsan
1) "mazi"
2) "ergou"
127.0.0.1:6379> sismember zhangsan lisi
(integer) 1
127.0.0.1:6379> sismember lisi zhangsan
(integer) 0
127.0.0.1:6379> smembers zhangsan
1) "wangwu"
2) "lisi"
3) "zhaoliu"
127.0.0.1:6379>
SortedSet类型的操作:
Redis的SortedSet是一个可排序的set集合。SortedSet中的每一个元素都有一个score属性,可基于score属性对元素进行排序,底层的实现是一个跳表(SkipList)加一个hash表。SortedSet特征:可排序,元素不重复,查询速度快。适用于排行榜这样的功能。
(error) ERR syntax error
127.0.0.1:6379> ZADD stus NX 85 Jack 89 Lucy 82 Rose 95 Tom Jerry 92 Amy 76 Miles
(error) ERR syntax error
127.0.0.1:6379> ZADD stus 85 Jack
(integer) 1
127.0.0.1:6379> ZADD stus 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
(integer) 6
127.0.0.1:6379> ZREM stus Tom
(integer) 1
127.0.0.1:6379> ZRANK stus Rose
(integer) 2
127.0.0.1:6379> ZREVRANK stus Rose
(integer) 3
127.0.0.1:6379> ZCARD stus
(integer) 6
127.0.0.1:6379> ZCOUNT stus 0 80
(integer) 2
127.0.0.1:6379> ZINCBY stus 2 Amy
(error) ERR unknown command 'ZINCBY', with args beginning with: 'stus' '2' 'Amy'
127.0.0.1:6379> ZINCRBY stus 2 Amy
"94"
127.0.0.1:6379> ZRANGE stus 0 2
1) "Miles"
2) "Jerry"
3) "Rose"
127.0.0.1:6379> ZREVRANGE stus 0 2
1) "Amy"
2) "Lucy"
3) "Jack"
Java的客户端们
Spring Data Redis兼容了jedis和lettuce.
Step 1: 引入jedis依赖
Step 2: 建立连接
Step 3: 使用jedis操作数据
Step 4: 释放资源
Step 1: start.spring.io新建一个springboot项目
Step 2: 引入spring-boot-starter -data-redis依赖,并在application.yml中完成redis的相关配置
Step 3: 用Autowired注解自动注入一个RedisTemplate
Step 4: 使用api操作redis即可
自动会注入RedisTemplate 的bean,要注意如果不配置的话,key和value都会进行redis的object序列化,转换成字节码的形式存储。所以需要手动配置RedisTemplate的序列化配置。或者直接用StringRedisTemplate,如果想要存Java对象的话,直接手动专成json再存进去。
案例
注册用户时发送验证码,然后在注册请求进来时校验验证码是否正确。
-
verify-code 接口,生成随机6位数的验证码 -> 放入redis中 -> send
-
login 接口,验证验证码 -> 把user放入redis中做缓存
-
其他接口,需要验证用户的token,从redis中获取这个用户是否存在,如果没有,则要求重新登录(返回401). 如果有,则刷新用户redis的有效期
1. refresh interceptor 从header中读取token -> 从redis中获取用户 -> 放user到ThreadLocal -> 更新redis中这个key的TTL
2. login interceptor 从ThreadLocal中获取user,如果没有,则返回401
3. 将上面的两个Interceptor放入到Interceptor Registry中,并设置好执行顺序
Reference: