Redis数据类型
Redis 的强大来自数据类型,而不是简单 key-value。String、Hash、List、Set、Sorted Set、Stream 等类型分别面向不同问题,选错类型会带来内存浪费、命令复杂度和维护风险。
# 1. 学习定位
| 维度 | 内容 |
|---|---|
| 难度层级 | 核心基础 |
| 核心目标 | 先会用,再理解机制,最后能做工程取舍和故障分析 |
| 学习方法 | 带着业务场景看命令、SQL、数据结构、日志和运行时指标 |
# 2. 核心地图
Redis数据类型
├─ String
├─ Hash
├─ List
├─ Set
├─ Sorted Set
├─ Stream
├─ Bitmap
├─ HyperLogLog
├─ Geo
├─ JSON
└─ Vector Set
# 3. 小章节深度讲解
下面把核心地图中的每个点拆开讲。每个小节都同时面向开发和运维:开发侧关注怎么设计、怎么写代码、怎么避免错误;运维侧关注怎么监控、怎么定位、怎么恢复。
# 3.1. String
# 是什么
String 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.2. Hash
# 是什么
Hash 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.3. List
# 是什么
List 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.4. Set
# 是什么
Set 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.5. Sorted Set
# 是什么
Sorted Set 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.6. Stream
# 是什么
Stream 属于 Redis Stream 的消息流模型。Stream 是可持久化的追加日志结构,消费组、ACK 和 PEL 让它比 List 更适合可靠消费。
# 开发人员怎么用
开发人员要处理重复投递、ACK、Pending 重试和幂等。消息处理成功后必须确认,失败后要能重新认领或进入补偿流程。
# 运维人员怎么看
运维人员要监控 Stream 长度、消费者延迟、PEL 大小、内存增长和裁剪策略。没有 XTRIM 或保留策略,Stream 会持续吃内存。
# 常见风险
常见风险是把 Stream 当无限队列,只写不裁剪;或者只 ACK 不做幂等,重试后产生重复业务效果。
# 3.7. Bitmap
# 是什么
Bitmap 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.8. HyperLogLog
# 是什么
HyperLogLog 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.9. Geo
# 是什么
Geo 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.10. JSON
# 是什么
JSON 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.11. Vector Set
# 是什么
Vector Set 属于 Redis 数据结构或内部编码。Redis 的性能来自“用合适结构表达合适问题”,而不是把所有内容都塞进一个大字符串。
# 开发人员怎么用
开发人员要根据访问模式选型:整体缓存用 String,局部字段用 Hash,排行用 ZSet,可靠消息用 Stream,近似统计用 HyperLogLog 或概率结构。
# 运维人员怎么看
运维人员要观察单 key 大小、元素数量、编码转换、内存占用和慢命令。内部编码从紧凑结构转换为哈希表或跳表后,内存和耗时可能阶跃变化。
# 常见风险
常见风险是 key 粒度失控:过细导致 key 数爆炸,过粗形成大 key。专家级建模要在访问效率和运维可控之间取平衡。
# 3.12. 本篇学习实验
建议准备一个独立 Redis 实例,构造小 key、大 key、热点 key、过期 key 和慢命令,观察 INFO、SLOWLOG、LATENCY、内存变化和客户端超时。每个实验都要记录命令复杂度和返回数据量。
开发侧实验重点是理解数据结构和命令边界,运维侧实验重点是理解延迟、内存和复制如何变化。真正掌握本篇内容,应该能从延迟尖刺反推大 key、慢命令、持久化或网络问题。
# 4. 核心机制
- String 是二进制安全字符串,可用于缓存值、计数器、位图和简单锁。
- Hash 适合小对象字段存储,可以局部更新字段,避免整对象序列化。
- List 适合简单队列和时间顺序列表,但复杂消息队列更应考虑 Stream。
- Sorted Set 用分数维护有序集合,是排行榜、延迟队列和范围查询的常用结构。
# 5. 工程实践
- 先写访问模式,再选数据类型:按字段更新用 Hash,按排名查用 ZSet,按事件消费用 Stream。
- 为每类 key 定义容量上限,避免单个结构无限增长。
- 集合类结构定期治理大 key,必要时拆分或分桶。
- 新型数据类型如 JSON、Time Series、Vector Set 要结合版本和部署形态验证。
# 6. 常见坑
- 所有对象都 JSON 序列化成 String,导致局部更新和统计困难。
- 用 List 实现复杂消费组,最终补出一套脆弱协议。
- ZSet 分数使用浮点时没有明确精度边界。
- 集合无限增长,删除和迁移时形成大 key 风险。
# 7. 专家视角
- Redis 数据类型选型是建模问题,不是命令记忆题。
- 专家会同时评估命令复杂度、内存编码、网络返回大小和故障恢复。
- 高级 Redis 设计会让 key 粒度与业务粒度匹配,既避免碎片化,也避免大 key。
# 8. Tips 快问快答
Q:对象缓存用 String 还是 Hash?
A:整体读写用 String,字段级读写和局部更新更适合 Hash。
Q:排行榜用什么?
A:通常用 Sorted Set,通过 score 排序。
Q:Redis 新数据类型能直接上生产吗?
A:要看版本、客户端、持久化、集群和运维工具是否支持。
# 9. 阶段小结
Redis数据类型 的学习重点不是记住零散概念,而是把它放回真实系统:数据如何进入、如何存储、如何被查询、如何在并发下保持正确、如何在故障后恢复。掌握这些连接关系,才能从“会用”走向“能设计、能优化、能排障”。