第16章:五大类型实战对比与总结
16.1 五种类型对比
| 类型 | 有序 | 唯一 | 底层结构 | 典型场景 |
|---|---|---|---|---|
| String | — | — | SDS | 缓存、计数器、分布式锁 |
| Hash | ❌ | field唯一 | listpack/hashtable | 用户信息、购物车 |
| List | ✅ | ❌ | quicklist | 消息队列、最新列表 |
| Set | ❌ | ✅ | listpack/hashtable | 标签、共同好友、去重 |
| ZSet | ✅ | ✅ | listpack/skiplist | 排行榜、延时队列 |
16.2 电商场景选型
需求 选型 理由
──────────────────────────────────────────────────
缓存商品详情 String JSON序列化,简单直接
购物车(用户→商品→数量) Hash field-value,更新单一商品
最新上架商品 List LPUSH + LTRIM 固定长度
商品标签 Set SINTER 交集查询
热销排行榜 ZSet ZREVRANGE 降序,ZINCRBY 实时更新
库存计数器 String INCR/DECR 原子操作16.3 底层数据结构简介
| 结构 | 用途 | 说明 |
|---|---|---|
| SDS(简单动态字符串) | String | 二进制安全,O(1) 取长度 |
| listpack(紧凑列表) | Hash/Set/ZSet 的小数据 | Redis 7.0 替代 ziplist |
| hashtable(哈希表) | Hash/Set | O(1) 查找 |
| skiplist(跳表) | ZSet | O(logN) 按分数/排名 |
| quicklist(快速列表) | List | 双向链表+压缩列表混合 |
16.4 选型决策树
数据需要排序?
├── 是 → 需要唯一?
│ ├── 是 → ZSet(排行榜、延时队列)
│ └── 否 → List(消息队列、最新列表)
└── 否 → 需要唯一?
├── 是 → 需要集合运算?
│ ├── 是 → Set(标签、共同好友)
│ └── 否 → Hash(对象存储)
└── 否 → String(缓存、计数器、锁)本章小结
- String → 万物皆字符串,INCR 计数器
- Hash → 对象存储,field-value 对
- List → 有序可重复,消息队列
- Set → 无序不重复,交并差运算
- ZSet → 有序不重复,排行榜神器
练习题
- 默写五种类型的对比表。
- 为以下场景选型并说明理由:微博热搜、用户签到、购物车、最近浏览记录、用户标签。
- (思考题)ZSet 为什么用跳表(skiplist)而不是红黑树?