Redis那些常用的数据结构到底是啥,数据库内部又是怎么组织的呢?
- 问答
- 2026-01-25 23:30:37
- 49
关于Redis的数据结构和内部组织,直接参考《Redis设计与实现》及Redis官方文档中的内容进行说明。
常用的数据结构
Redis对外直接暴露的、供用户使用的通常被称为“数据结构”或“数据类型”,主要有以下几种:
-
字符串(String):这是最简单的一种类型,它不仅仅是存文本,还可以存数字(整数或浮点数),甚至是二进制的数据(比如一张图片的字节),你可以对它进行自增、自减操作,如果存的是数字的话,来源:Redis官方命令文档。
-
列表(List):一个按插入顺序排序的字符串元素集合,你可以在它的头部(左边)或尾部(右边)插入新元素,很像一个双端队列,常用来做简单的消息队列(一头进,另一头出)或动态列表,来源:Redis官方命令文档。

-
集合(Set):一个无序的、不重复的字符串元素集合,它支持快速的添加、删除和检查成员是否存在,并且可以方便地求多个集合的交集、并集和差集,比如可以用来存储文章的所有标签,来源:Redis官方命令文档。
-
有序集合(Sorted Set / ZSet):这是Set的升级版,每个成员都会关联一个“分数”(score),一个浮点数,集合会根据这个分数从小到大进行排序,成员是唯一的,但分数可以重复,它非常适合做排行榜,比如根据用户积分排序,来源:Redis官方命令文档。
-
哈希(Hash):一个键值对集合,特别适合用来存储一个对象,比如存储一个用户信息,键是用户ID,值是一个哈希结构,里面包含了“姓名”、“年龄”等字段和对应的值,它允许你单独读取或修改某个字段,非常高效,来源:Redis官方命令文档。
-
位图(Bitmap)和 HyperLogLog:它们本质上是基于字符串结构实现的特殊用法,位图通过操作字符串的每一个二进制位,可以极其节省空间地进行布尔统计(比如用户签到),HyperLogLog则是一种用于估算海量数据基数(去重后数量)的概率算法结构,只需要很小的内存,来源:Redis官方命令文档中对BIT和PF命令的介绍。

数据库内部的组织方式
Redis内部如何管理这些数据,可以参考《Redis设计与实现》一书中的详细描述:
-
数据库实例:一个Redis服务器默认会创建16个逻辑数据库(编号0-15),你可以用
SELECT命令切换,每个数据库都是一个独立的命名空间,互不干扰。 -
关键结构:字典:Redis数据库内部最核心的组织结构是一个名为“字典”或“哈希表”的东西,你可以把它想象成一个巨大的、可以快速查找的索引,这个字典的“键”就是用户设置的字符串键(比如
user:1001),而字典的“值”则是一个指向具体数据对象的指针,来源:《Redis设计与实现》第4章。
-
数据对象的结构:上面字典里存的“值”指针,指向的是一个统一的结构体,在源码里叫
redisObject,这个结构体包含了几个重要信息:- 类型(type):标明这个对象是字符串、列表、哈希等五种基本类型中的哪一种。
- 编码(encoding):这是内部实现的关键,它指明了这个数据对象底层实际用什么数据结构存储,同一种数据类型,在不同条件下,可能会采用不同的编码来节省空间或提升效率。
- 指向底层数据的指针(ptr):真正存储数据的地方。
- 其他信息:如引用计数(用于内存回收)、最后一次被访问的时间(用于LRU淘汰算法)等,来源:《Redis设计与实现》第2章。
-
编码的灵活性(关键所在):这是理解Redis内部组织的重点。
- 一个字符串,如果它是数字,可能用整数编码存储;如果是短字符串,就用一种叫“简单动态字符串”的结构;如果是大字符串,可能用其他方式。
- 一个列表,如果元素少且小,会用一种紧凑的“压缩列表”顺序存储,以节省内存;当元素变多或变大时,会自动转换成标准的双向链表。
- 一个哈希或有序集合,在元素较少时也使用“压缩列表”,超过阈值后,哈希会转换成真正的哈希表,有序集合会转换成“跳跃列表+字典”的混合结构。 这种编码转换对用户是完全透明的,由Redis在后台自动完成,目的是在内存效率和操作速度之间取得最佳平衡,来源:《Redis设计与实现》第2、6、7、8章。
-
键的过期管理:Redis允许为键设置生存时间,它内部通过另一个字典来存储键到过期时间的映射,它采用惰性删除(用到时才检查是否过期)加定期抽样删除的策略来清理过期键,以避免集中删除对性能的影响,来源:《Redis设计与实现》第9章。
-
持久化时的组织:当进行RDB快照持久化时,Redis会遍历数据库字典,将键和经过序列化的值按格式保存到文件,当进行AOF日志持久化时,Redis会将每一个修改数据的命令记录到文件,恢复时重新执行这些命令,在AOF重写时,Redis会读取当前数据库的状态,反向构造出最简洁的命令序列,来源:《Redis设计与实现》第10、11章。
Redis对外提供了一套简单易用的数据结构,而其内部通过一个全局哈希表来快速定位键,每个键对应的值对象内部则根据实际情况,灵活采用多种底层数据结构实现,并在内存和性能之间自动优化。
本文由瞿欣合于2026-01-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://efkn.haoid.cn/wenda/85953.html
