Redis 应用

Redis 应用

数据类型场景应用

Redis 常见数据类型和应用场景 | 小林coding (xiaolincoding.com)

String

缓存对象

常规计数

因为 Redis 处理命令是单线程,所以执行命令的过程是原子的,因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等

分布式锁

SET 命令有个 NX 参数可以实现key 不存在才插入,可以用它来实现分布式锁:

一般而言,还会对分布式锁加上过期时间

共享 Session 信息

List

消息队列

消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性

Redis 的 List 和 Stream 两种数据类型可以满足消息队列的这三个需求

Hash

购物车

以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素

涉及的命令如下:

当前仅仅是将商品ID存储到了Redis 中,在回显商品具体信息的时候,还需要拿着商品 id 查询一次数据库,获取完整的商品的信息

Set

点赞

Set 类型可以保证一个用户只能点一个赞

共同关注

Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号

抽奖活动

存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次

ZSet

排行榜

有序集合比较典型的使用场景就是排行榜。例如学生成绩的排名榜、游戏积分排行榜、视频播放排名、电商系统中商品的销量排名等

电话/姓名排序

使用有序集合的 ZRANGEBYLEX 或 ZREVRANGEBYLEX 可以帮助我们实现电话号码或姓名的排序

Bitmap

签到统计

在签到打卡的场景中,我们只用记录签到(1)或未签到(0),所以它就是非常典型的二值状态

分布式锁

Redis 分布式锁的实现通常使用 SetNX 命令,当 key 不存在时设置 key

val 为 uuid,expiration 为5s

过期时间避免原本加锁的 worker 崩溃后锁永远无法释放

锁值为 uuid 保证了锁的可识别性,在释放锁的时候通过检查 val 避免释放别人的锁
释放锁过程:

  1. 检测锁值是否为自己的 uuid
  2. 是则释放锁

实现基于 Redis 的公平锁,为等待锁的进程分配优先级,确保长时间等待的进程能够优先获得锁,解决饥饿问题