Redis 基础数据结构介绍和使用
一、String(字符串)
help @String
1. 常见使用场景
(1) 单值缓存
SET key value
APPEND key value
(2) 对象缓存
SET object:1 '{"name":"aaa","age":"80"}'
# 或使用 Hash 模拟
MSET object:1:name aaa object:1:age 80
MGET object:1:name object:1:age
(3) 分布式锁
SETNX object:1 true
二、Hash(哈希)
help @hash
Hash 结构的优缺点
常用场景:(1)活动发奖一个活动多个奖品 (2)购物车,userKey shop 1
优点:
- 同类数据归类存储,方便管理
- 相比 String,消耗内存和 CPU 更少
- 相比 String,存储上占用空间也更少
缺点:
- 过期时间不能用在 field 上,只能用在 key 上
- 在集群架构上,整个集群共同分摊一万多个槽位,不适合大规模使用,可能 hash 到多台机器
三、List(列表)
help @list
常用组合
| 数据结构 | 说明 | 操作命令 |
|---|---|---|
| Stack(栈) | 后进先出 | LPUSH + LPOP |
| Queue(队列) | 先进先出 | LPUSH + RPOP |
| Blocking MQ(阻塞队列) | 阻塞消费 | LPUSH + BRPOP |
使用场景
- 吃饭排队,用队列结构一个个从右边弹出
- 签到列表,来一个 push 一个
- 简单的 MQ
缺点
- 一个 list 的容量是
2^32 - 1个元素,注意大 key 出现 - list 底层是双向链表,操作两头数据性能很高,操作中间的元素性能较差
四、Set(集合)
help @set
应用场景
-
抽奖:参与则加入,已存在不做处理
SMEMBERS key # 查看参与人数 SRANDMEMBER key # 随机抽取中奖者 -
微信点赞、文章收藏
-
集合运算:抖音"可能认识的人"功能 —— 把你朋友的关注和你的关注做差集,推给你
五、ZSet(有序集合)
help @zset
常用场景:排行榜
# (1) 增加点击量
ZINCRBY weixistudy:20260101 1 人工智能
# (2) 展示当日点击量前 10
ZREVRANGE weixistudy:20260101 0 9 WITHSCORES
# (3) 展示 3 日内有哪些内容被访问
ZUNIONSTORE weixistudy:20260101-20260103 3
weixistudy:20260101 weixistudy:20260102 weixistudy:20260103
# (4) 展示 3 日访问前 10
ZREVRANGE weixistudy:20260101-20260103 0 9 WITHSCORES
六、Bitmap(位图)
help @bitmap
使用场景:日历签到
# 1 号用户第 100 天完成签到
SETBIT dailycheck:1 100 1
# 统计 1 号用户的签到次数
BITCOUNT dailycheck:1
# 统计 1 号用户第一次签到的时间(第一个 1 的位置)
BITPOS dailycheck:1 1
总结
| 数据结构 | 底层实现 | 典型使用场景 |
|---|---|---|
| String | SDS 简单动态字符串 | 缓存、计数器、分布式锁 |
| Hash | ziplist / hashtable | 对象存储、购物车 |
| List | quicklist(ziplist + 双向链表) | 消息队列、时间线 |
| Set | intset / hashtable | 去重、抽奖、社交关系 |
| ZSet | ziplist / skiplist + hashtable | 排行榜、带权重队列 |
| Bitmap | String(位操作) | 签到、用户标签、布隆过滤器 |