Redis使用场景
Redis 作为高性能键值存储,广泛应用于缓存、分布式锁、计数器等多个场景。每个场景标注了推荐使用的 Redis 数据结构类型。
适用场景:需要高性能读写的业务场景,如电商秒杀、社交互动、实时统计等。以下场景均基于 Redis 单线程模型的原子性保证,无需额外加锁。
缓存
String 类型,用于热点数据缓存(如报表、热点内容)、对象缓存、全页缓存,提升热点数据的访问速度。
数据共享分布式
String 类型,Redis 是分布式的独立服务,可以在多个应用之间共享。典型场景是分布式 Session:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>分布式锁
String 类型,使用 SET key value NX EX 原子命令实现(NX 表示不存在才设置,EX 设置过期时间)。注意:setnx + expire 是两条命令,存在竞态条件,必须使用原子操作。
# 加锁(原子操作,10秒自动过期)
SET lock:order:1001 "owner_id" NX EX 10
# 释放锁(Lua 脚本保证原子性,避免误删他人锁)
EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 lock:order:1001 owner_id生产环境建议
使用 Redisson 等成熟客户端库实现分布式锁,它封装了 watchdog 自动续期、可重入锁、红锁等复杂逻辑。自行实现容易遗漏边界情况。
全局 ID
int 类型,incrby 利用原子性。分库分表场景,一次性拿一段 ID:
incrby userid 1000计数器
int 类型,incr 方法。例如文章阅读量、微博点赞数,允许一定延迟,先写入 Redis 再定时同步到数据库。
限流
int 类型,incr 方法。以访问者 IP 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false。
位统计
String 类型的 bitcount,字符以 8 位二进制存储,非常节省空间(1 MB = 8388608 bit),适合大数据量统计:
# 在线用户统计
setbit onlineusers 0 1
setbit onlineusers 1 1
setbit onlineusers 2 0
# 计算7天都在线的用户
BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ... "day_7_online_users"支持按位与、按位或、按位异或、按位非操作。
购物车
String 或 Hash 类型。key 为用户 ID,field 为商品 ID,value 为商品数量:
- +1:hincr
- -1:hdecr
- 删除:hdel
- 全选:hgetall
- 商品数:hlen
用户消息时间线
List 类型,双向链表,直接作为 timeline,插入有序。
消息队列
List 提供阻塞弹出操作 blpop/brpop,可设置超时时间:
- 队列(先进先出):rpush + blpop,右边进入队列,左边出队列
- 栈(先进后出):rpush + brpop
抽奖
Set 类型自带随机获得值:
spop myset点赞、签到、打卡
Set 类型维护点赞用户:
sadd like:t1001 u3001 # 点赞
srem like:t1001 u3001 # 取消点赞
sismember like:t1001 u3001 # 是否点赞
smembers like:t1001 # 点赞的所有用户
scard like:t1001 # 点赞数商品标签
Set 类型维护商品标签:
sadd tags:i5001 画面清晰细腻
sadd tags:i5001 真彩清晰显示屏商品筛选
利用 Set 的交集、并集、差集运算:
# 筛选苹果的、iOS 的、屏幕在 6.0-6.24 之间的、LCD 屏幕
sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd用户关注、推荐模型
Set 类型维护关注和粉丝关系:
# 相互关注
sadd 1:follow 2
sadd 2:fans 1
sadd 1:fans 2
sadd 2:follow 1
# 我关注的人也关注了他(取交集)
sinter 1:follow 2:fans
# 可能认识的人(差集)
sdiff 2:follow 1:follow排行榜
Sorted Set 类型:
# 新闻点击数加1
zincrby hotNews:20190926 1 n6001
# 获取今天点击最多的15条
zrevrange hotNews:20190926 0 15 withscores