Redis 五大数据类型底层结构对比表
类型 | 底层数据结构(Redis ≥ 5/6/7) | 优点 | 缺点 & 注意点 | 适用场景 |
---|---|---|---|---|
String | 简单动态字符串(SDS) | 快速、灵活(自动扩容、二进制安全) | 最大限制 512MB | 缓存简单对象、计数器(INCR对整数自增)、分布式锁(SETNX)、限流令牌等 |
List | ✅ ZipList | 插入删除快、结构紧凑 支持分页操作 | 插入太多可能导致大链表、影响 GC | 消息队列、任务列表、最新消息显示(如微博Timeline最近N条存List),还可用 lrange 做分页 |
Set | intset(小量整数) ➡️ hashtable(大集合或字符串) | 无序去重、添加/删除 O(1) | 元素太大、需考虑哈希冲突 | 标签集合、联合好友列表、共同好友(交集)计算、抽奖随机抽取(SRANDMEMBER)等 |
ZSet | ✅ skiplist + dict ZipList | 有序结构、范围查询快、支持排名 | 插入删除比 set 慢,跳表占用略大 | 排行榜(score为分数或时间,实现按分排序及排名)、延迟队列(score为时间戳,定时取出<=当前时间的任务)。常用操作有按照分值范围或排名范围取元素(ZRANGE by score或排名) |
Hash | ziplist(小结构) ➡️ hashtable(大字段) → Redis 7 使用 listpack 替代 ziplist | 节省内存、键值访问快 | 字段太多仍可能较大,适合结构平坦的数据 | 用户信息、商品信息 |
Bitmap | 实际上是字符串的一种,但按bit操作,可以高效地存储海量布尔值 | 用户签到(一位表示某天是否签到)、在线状态位、布隆过滤器底层 | ||
HyperLogLog | 用于基数统计的概率数据结构,特点是占用固定小内存却能近似估计独立元素数量 | UV统计(网站独立访客数),只需很小内存容忍误差。 | ||
Stream(流) | Redis 5.0引入的数据类型,类似日志存储 | 消息队列系统,实现可靠消息和消费确认 |
Redis 版本中结构的演进(关键知识点)
Redis版本 | 替换内容 | 说明 |
---|---|---|
Redis 3.2 | List 从 ziplist → quicklist | 改善 list 插入性能 |
Redis 7 | ziplist 正式被废弃 | 用 listpack 替代,体积更小、安全性高 |
Redis 6+ | 支持模块定义自己的数据结构 | 如 RedisTimeSeries、RedisBloom 等 |
quicklist vs ziplist vs listpack 对比
特性 | ziplist | quicklist | listpack(Redis 7) |
---|---|---|---|
内存结构 | 连续内存 | 链表 + ziplist(压缩块) | 更小的压缩格式(优化内存布局) |
插入删除性能 | 差(需内存拷贝) | 好(链表节点局部更新) | 中等 |
安全性 | 存在过边界 bug | 安全(节点单独处理) | 安全 |
使用场景 | 已废弃 | Redis list 默认实现 | Hash / ZSet / List 的底层结构之一 |
实战建议总结:
类型 | 实战建议 |
---|---|
String | 值尽量不超过几 KB,避免大 key 问题 |
List | 消息队列用 LPUSH + BRPOP ,分页用 LRANGE ,注意链表过长 |
Set | 用于去重、抽奖、推荐系统;使用前确认数据量和类型是否合适 |
ZSet | 排行榜、限时处理任务;可通过 ZREMRANGEBYRANK 清理老数据 |
Hash | 适合存结构化对象,但字段数量不要太大(上千个字段建议分表) |