Redis 应用
Redis 应用
数据类型场景应用
String
缓存对象
常规计数
因为 Redis 处理命令是单线程,所以执行命令的过程是原子的,因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等
分布式锁
SET 命令有个 NX 参数可以实现key 不存在才插入,可以用它来实现分布式锁:
- 如果 key 不存在,则显示插入成功,可以用来表示加锁成功
- 如果 key 存在,则会显示插入失败,可以用来表示加锁失败
一般而言,还会对分布式锁加上过期时间
共享 Session 信息
List
消息队列
消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性
Redis 的 List 和 Stream 两种数据类型可以满足消息队列的这三个需求
Hash
购物车
以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素
涉及的命令如下:
- 添加商品:
HSET cart:{用户id} {商品id} 1 - 添加数量:
HINCRBY cart:{用户id} {商品id} 1 - 商品总数:
HLEN cart:{用户id} - 删除商品:
HDEL cart:{用户id} {商品id} - 获取购物车所有商品:
HGETALL cart:{用户id}
当前仅仅是将商品ID存储到了Redis 中,在回显商品具体信息的时候,还需要拿着商品 id 查询一次数据库,获取完整的商品的信息
Set
点赞
Set 类型可以保证一个用户只能点一个赞
共同关注
Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号
抽奖活动
存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次
ZSet
排行榜
有序集合比较典型的使用场景就是排行榜。例如学生成绩的排名榜、游戏积分排行榜、视频播放排名、电商系统中商品的销量排名等
电话/姓名排序
使用有序集合的 ZRANGEBYLEX 或 ZREVRANGEBYLEX 可以帮助我们实现电话号码或姓名的排序
Bitmap
签到统计
在签到打卡的场景中,我们只用记录签到(1)或未签到(0),所以它就是非常典型的二值状态
分布式锁
Redis 分布式锁的实现通常使用 SetNX 命令,当 key 不存在时设置 key
val 为 uuid,expiration 为5s
过期时间避免原本加锁的 worker 崩溃后锁永远无法释放
锁值为 uuid 保证了锁的可识别性,在释放锁的时候通过检查 val 避免释放别人的锁
释放锁过程:
- 检测锁值是否为自己的 uuid
- 是则释放锁
实现基于 Redis 的公平锁,为等待锁的进程分配优先级,确保长时间等待的进程能够优先获得锁,解决饥饿问题