Skip to content

第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/SetO(1) 查找
skiplist(跳表)ZSetO(logN) 按分数/排名
quicklist(快速列表)List双向链表+压缩列表混合

16.4 选型决策树 ​

数据需要排序?
├── 是 → 需要唯一?
│   ├── 是 → ZSet(排行榜、延时队列)
│   └── 否 → List(消息队列、最新列表)
└── 否 → 需要唯一?
    ├── 是 → 需要集合运算?
    │   ├── 是 → Set(标签、共同好友)
    │   └── 否 → Hash(对象存储)
    └── 否 → String(缓存、计数器、锁)

本章小结 ​

  • String → 万物皆字符串,INCR 计数器
  • Hash → 对象存储,field-value 对
  • List → 有序可重复,消息队列
  • Set → 无序不重复,交并差运算
  • ZSet → 有序不重复,排行榜神器

练习题 ​

  1. 默写五种类型的对比表。
  2. 为以下场景选型并说明理由:微博热搜、用户签到、购物车、最近浏览记录、用户标签。
  3. (思考题)ZSet 为什么用跳表(skiplist)而不是红黑树?

把零散知识,整理成可以反复走的路。