Redis 五大数据类型

底层结构 · 常用命令 · 编码方式 · 典型场景

🔤
String 字符串
Simple Dynamic String (SDS)
最基础类型

最简单的键值映射,值可以是任意字符串(文本、JSON、序列化对象)或整数/浮点数。最大值 512 MB

数据结构示意
user:1001
"Alice" String
page:views
98432 Int
token:abc
eyJhbGci...xyz embstr
SDS 内部布局
len
5
alloc
8
flags
8
"Alice\0"
已用
分配
类型
buf[]
底层编码
🔢 int — 整数 ≤ 2⁶³
📦 embstr — ≤ 44 字节
📄 raw — > 44 字节
常用命令 & 复杂度
SET O(1)
GET O(1)
INCR O(1)
APPEND O(1)
STRLEN O(1)
SETEX O(1)
GETRANGE O(N)
典型应用场景
🔑Session / Token 缓存(配合 TTL)
📊计数器:页面 PV、点赞数、库存(INCR 原子+1)
🔒分布式锁(SET … NX EX)
🗜️对象序列化缓存(JSON / Protobuf)
📋
List 列表
QuickList / LinkedList / Listpack
有序 · 可重复

有序的字符串集合,支持双端操作。Redis 7.0 起全部使用 Listpack 作为底层节点压缩。

双向链表结构(QuickList 节点)
← LPUSH / LPOP (队头) RPUSH / RPOP (队尾) →
task1
index 0
task2
index 1
task3
index 2
task4
index 3
每个节点保存 prev / next 指针,支持 O(1) 两端操作
QuickList — 多个 Listpack 节点组成链表
Listpack 1
a
b
c
Listpack 2
d
e
f
更多…
底层编码
🗜️ listpack — 元素 ≤ 128 且值 ≤ 64B
quicklist — 超出阈值自动转换
常用命令 & 复杂度
LPUSH / RPUSH O(1)
LPOP / RPOP O(N)
LRANGE O(N)
LINDEX O(N)
LLEN O(1)
BLPOP 阻塞
典型应用场景
📨消息队列(LPUSH + BRPOP 实现生产消费)
📰时间线 / 最新动态(LPUSH + LTRIM 保留最新 N 条)
🔄任务调度队列、延迟队列
📚栈 / 队列数据结构(LPUSH+LPOP 或 LPUSH+RPOP)
🗂️
Hash 哈希
Dict (Hash Table) / Listpack
字段-值映射

一个 key 对应一张字段表,每个字段独立存储,非常适合对象存储。比将整个对象序列化为 String 节省内存 & 支持局部更新

Hash 内部结构示例:user:1001
FieldValue
name"Alice"
age"28"
city"Shanghai"
score"9800"
vip"true"
dict 哈希表实现(大 Hash)
Bucket
[0] →
[1] →
[2] nil
[3] →
name → "Alice" → next:nil
age → "28" → next:nil
city → "SH" → next:nil
渐进式
rehash
扩容
底层编码
🗜️ listpack — 字段 ≤ 128 且值 ≤ 64B
🧮 hashtable — 超出阈值转换
常用命令 & 复杂度
HSET O(1)
HGET O(1)
HMSET O(N)
HGETALL O(N)
HDEL O(1)
HEXISTS O(1)
HINCR O(1)
典型应用场景
👤用户对象缓存(局部字段更新,避免全量序列化)
🛒购物车(field=商品ID,value=数量)
⚙️配置中心(按字段读取系统配置项)
📈聚合统计(HINCR 实现多维度计数)
🎯
Set 集合
HashTable / Intset / Listpack
无序 · 唯一

无序且不重复的字符串集合,支持集合运算(交、并、差)。底层用哈希表实现 O(1) 查找

Set 元素(无序,唯一)
🍎 apple
🍌 banana
🍊 orange
🍇 grape
🍑 peach
再次 SADD "apple" → 返回 0,元素不变,天然去重
集合运算示意
SINTER 交集
c
d
SUNION 并集
a
b
c
d
e
SDIFF 差集
a
b
底层编码
🔢 intset — 全整数 且 ≤ 512 个
🗜️ listpack — 元素 ≤ 128 且值 ≤ 64B
🧮 hashtable — 超出阈值转换
常用命令 & 复杂度
SADD O(1)
SREM O(1)
SISMEMBER O(1)
SMEMBERS O(N)
SINTER O(N×M)
SUNION O(N)
SRANDMEMBER O(1)
典型应用场景
👥共同好友(SINTER userA:friends userB:friends)
🎰抽奖系统(SRANDMEMBER 随机不重复抽取)
🏷️标签系统(文章 tag,用户兴趣标签)
🚫黑名单 / UV 去重(天然唯一性保障)
🏆
ZSet 有序集合
SkipList + Hash Dict / Listpack
有序 · 唯一 · 带分数

每个成员关联一个 浮点分数(score),集合按 score 自动排序。底层同时维护一个跳表(快速范围查询)和哈希表(快速单点查询),是 Redis 最精妙的数据结构。

排行榜视图(按 score 升序)
排名 成员 Score 分数条
常用命令 & 复杂度
ZADD O(log N)
ZSCORE O(1)
ZRANK O(log N)
ZRANGE O(log N+M)
ZRANGEBYSCORE O(log N+M)
ZREVRANK O(log N)
ZINCRBY O(log N)
ZREM O(log N)
跳表(SkipList)结构示意
L3
HEAD
100
NIL
L2
HEAD
50
100
NIL
L1
HEAD
10
50
80
100
NIL
● 查找 score=80:L3 跳过 → L2 跳过 → L1 逐步找到
● 期望时间复杂度 O(log N),比链表 O(N) 快得多
底层编码
🗜️ listpack — 元素 ≤ 128 且值 ≤ 64B
⛓️ skiplist + hashtable — 超出阈值转换
典型应用场景
🏅游戏排行榜(ZREVRANGE 取 Top-N)
延迟队列(score=执行时间戳,ZRANGEBYSCORE 拉取到期任务)
🔥热搜词 / 热门内容(ZINCRBY 累加热度分)
📡滑动窗口限流(score=时间戳,ZREMRANGEBYSCORE 清过期)
📊 五大类型对比总览
类型 有序 唯一 查找 最大容量 底层结构 核心优势
String O(1) 512 MB SDS 通用、支持原子计数、二进制安全
List ✓ 插入序 O(N) 2³² 个 QuickList 双端 O(1) 操作、阻塞弹出
Hash ✓ Field O(1) 2³² 个字段 Dict / LP 局部字段更新、节省内存
Set O(1) 2³² 个 HT / Intset 集合运算、天然去重
ZSet ✓ score O(log N) 2³² 个 SkipList+HT 自动排序、高效范围查询