86人参与 • 2026-09-22 • Redis
redis 之所以强大,不只是因为快,更因为它提供了丰富的数据结构——就像仓库里不同形状的收纳盒,各有各的用处,选对了事半功倍。
最基本的类型,一个 key 对应一个 value,二进制安全,能存文本、数字、序列化对象,理论上限 512mb。
键值对集合,一个 key 下面挂多个 field-value 对,天然适合存 对象属性。
有序字符串列表,底层是双向链表(3.2 后改为 quicklist),支持两端快速插入和删除。
无序且元素不重复的集合,查找和去重效率高,支持交集、并集、差集运算。
和 set 类似,但每个元素带一个 score 用于排序,有序 set,底层用跳表 + 字典实现,插入和查询都很快。
随着 redis 版本迭代,又陆续加入了四种高级类型,应对更特殊的场景。
用 bit 位存储数据,一个 bit 只有 0 和 1 两种状态,极度节省空间。
基数统计算法,用极小的内存(约 12kb)就能统计超大数量级的不重复元素数。
底层基于 zset 实现,存储 经纬度 信息,支持距离计算和范围查询。
redis 5.0 引入的消息流类型,更专业的消息队列方案。
表面上是九种数据类型,底层实际由更少的编码结构组合而成。redis 会根据数据量和元素大小自动选择编码,小数据用紧凑结构省内存,大数据切换到高效结构保性能。
ziplist(压缩列表)
连续内存块组成的紧凑型结构,没有指针开销,非常省空间。小数据量的 list、hash、zset 都用它。

但缺点是插入和删除需要移动内存,数据量大了性能会下降,所以达到阈值后会自动转换编码。
quicklist(快速列表)
redis 3.2 之后 list 的默认实现,可以理解为"链表 + 压缩列表"的混合体——每个链表节点是一个 ziplist,既保留了 ziplist 的内存效率,又减少了普通双向链表的内存碎片和指针开销。
skiplist(跳跃表)
zset 的核心结构,在有序链表基础上增加了多层索引,把查找效率从 o(n) 提升到 o(log n)。配合一个字典用来做 o(1) 的成员查找,两者数据共享不重复存储。
以 zset 为例,默认转换阈值:
hash 和 list 也有类似的自动转换机制,阈值都可以在配置文件里调整。
需求场景 | 推荐类型 | 为什么选它 |
|---|---|---|
存单个值、计数器、分布式锁 | string | 最简单直接,原子操作可靠 |
存对象的多个属性,经常修改单个字段 | hash | 字段级操作,不需要整体序列化 |
消息队列、最新列表、按顺序存取 | list / stream | list 简单够用,stream 功能更全 |
去重、标签、共同好友、集合运算 | set | 天然去重,集合运算高效 |
排行榜、带排序的集合 | zset | 按 score 排序,范围查询方便 |
签到、在线状态、海量布尔标记 | bitmap | 极度省空间,位运算高效 |
统计 uv、独立访客(不要求精确) | hyperloglog | 12kb 搞定亿级基数统计 |
附近的人、地理位置查询 | geo | 内置经纬度存储和距离计算 |
虽然 string 理论上限 512mb,但生产环境存大 value 是严重的反模式。大 key 不只是 string 的问题,集合类型元素过多同样危险。
数据类型 | 大 key 阈值 | 主要风险 |
|---|---|---|
string | value > 10kb | 网络传输延迟,阻塞其他请求 |
hash / set / zset | 元素数量 > 5,000 | hgetall / smembers 全量操作阻塞 |
list | 元素数量 > 10,000 | lrange 大范围操作耗时 |
stream | 消息数量 > 10,000 | xrange 遍历性能下降 |
redis-cli --bigkeys 或 memory usage 定期扫描发现大 keyredis 的数据类型看似只是"存东西的不同方式",实际上每种都对应着一类问题的最优解。理解了底层编码和选型逻辑,才能在项目里更好地用 redis。
到此这篇关于redis 数据结构详解之从五种基础到四种高级的文章就介绍到这了,更多相关redis 数据结构内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论