一.业务数据缓存*
经典用法。
通用数据缓存,string,int,list,map等。
- 验证码等
实时热数据,最新500条数据。
- 如热搜新闻。。
会话缓存,token缓存等。
- spring-session-data-redis sesion共享
二.业务数据处理
非严格一致性要求的数据
评论,点击,点赞等。
set key 0 incr key // incr readcount::{帖子id} 每阅读一次 get key // get readcount::{帖子id} 获取阅读量
业务数据去重
- 订单处理的幂等校验等。 如订单id放到redis 的set中去重复, bitmap 等
业务数据排序
- 排名,排行榜等。 使用sortedset
三.全局一致计数 *
全局流控计数
多个服务节点使用同一个redis的计数。
秒杀的库存计算
和全局计数类似
抢红包
和全局计数类似
全局ID生成
例如:userId, 直接获取一段userId的最大值,缓存到本地服务慢慢累加,快到了userId的最大值时,再去获取一段,一个用户服务宕机了,也就一小段userId没有用到。 用数据库也可以。
set userId 0 incr usrId //返回1 incrby userId 1000 //返回10001
四.高效统计计数
id去重,记录访问ip等
全局bitmap操作
UV、PV等访问量==>非严格一致性要求
五.发布订阅与Stream
Pub-Sub 模拟队列
127.0.0.1:6379> subscribe fzb Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "fzb" 3) (integer) 1 1) "message" 2) "fzb" 3) "fff" 1) "message" 2) "fzb" 3) "ffff" 127.0.0.1:6379> publish fzb fff (integer) 1 127.0.0.1:6379> publish fzb ffff (integer) 1
Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列(MQ,Message Queue)。
六.分布式锁*
1、获取锁–单个原子性操作
- SET dlock my_random_value NX PX 30000
127.0.0.1:6379> set myLock 1 NX PX 30000
OK
127.0.0.1:6379> set myLock 1 NX PX 30000
(nil)
2、释放锁–lua脚本-保证原子性+单线程,从而具有事务性 . => 因为内存操作是单线程的
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1]) else
return 0 end
- 关键点:原子性、互斥、超时