聊聊Redis那些经典数据结构和它们背后的实现细节,感觉挺有意思的
- 问答
- 2026-01-08 10:48:58
- 4
说到Redis,很多人第一反应就是“快”,但它为什么能这么快?除了因为它是内存数据库,直接把数据放在内存里操作之外,最关键的一点就是它那套精心设计的数据结构,Redis不是一个简单的键值对存储,它的值可以是多种多样的数据结构,而每种结构背后都有巧妙的实现,这让它在处理不同场景时都能游刃有余。
先从最简单的字符串(String)说起。 这可能是我们最常用的类型了,比如用来做缓存,存个用户信息、计数器什么的,你可能会想,字符串不就是个字符数组吗?能有什么花样?Redis还真玩出了花样,它使用了一个叫“简单动态字符串”(SDS)的结构,而不是C语言里传统的以\0结尾的字符数组,这个SDS结构里,除了存字符串本身,还额外记录了两个关键信息:一个是当前字符串的已用长度,另一个是分配给这个字符串的总空间大小,这样做的好处太大了!我们要获取字符串的长度,C语言的传统做法是遍历整个数组直到遇到\0,时间复杂度是O(n);而SDS直接读取记录的长度值,时间复杂度是O(1),瞬间完成,再比如,要追加字符串时,SDS会先检查空间够不够,如果不够会自动进行扩容,避免了缓冲区溢出的风险,这种用空间换时间,以及预分配的策略,正是Redis高性能的基石之一。(来源:Redis设计与实现)
再来看看列表(List), 它常被用来实现消息队列或者最新消息排行,Redis的列表底层实现,在早期版本中,当列表元素比较少的时候,会使用一块连续的内存来存储,这叫“压缩列表”(ziplist),它是一种非常紧凑的结构,能节省很多内存,当元素数量变多或者某个元素变大时,压缩列表的查询效率会下降,所以Redis会把它转换成一个叫“快速列表”(quicklist)的结构,你可以把quicklist想象成一个大火车,每一节车厢都是一个小的压缩列表,车厢之间用指针连接起来,这样设计的好处是,既保留了压缩列表节省内存的优点,又在整体上是一个链表结构,在中间插入或删除元素时,不用像数组那样挪动后面所有的数据,只需要调整局部车厢的内容和指针就行了,效率很高。(来源:Redis源码与相关技术博客)
集合(Set) 的特点是元素不重复,适合用来存储标签、共同好友等,它的底层实现有两个选择:一个是“整数集合”(intset),当集合里的所有元素都是整数且数量不多时,Redis会使用这种结构,它就是一个有序的整数数组,查找时可以用二分法,效率很高而且极其节省内存,另一个就是更常见的“哈希表”(hash table),哈希表我们待会儿会细说,它的优势是平均情况下查找、插入、删除的速度都非常快,接近O(1),Set用它来保证元素的唯一性,其实就是利用了哈希表键的唯一性。
有序集合(ZSet) 是Redis里一个非常强大的数据结构,它像Set一样保证成员唯一,但每个成员都关联一个分数(score),可以根据分数进行排序,玩排行榜功能,用它就再合适不过了,它的实现更是融合了两种数据结构的精华:一个是以成员为键、分数为值的哈希表,这样可以快速根据成员找到对应的分数(O(1)时间复杂度),另一个是“跳跃表”(skiplist),跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,简单理解,它就像给一个有序链表加了很多层“电梯”,查找的时候可以从最高层开始,大步跨越,逐层缩小范围,最终找到目标,效率可以媲美平衡树,但实现起来又简单很多,Redis用跳跃表来维护分数的排序,这样就可以快速地做范围查询,取分数前10名的成员”。(来源:Redis官方文档关于Sorted Set的实现)
最后不能不提哈希(Hash), 它适合存储对象,比如把一个用户的姓名、年龄、城市等信息作为一个整体存起来,它的底层就是经典的哈希表,Redis的哈希表在处理冲突时使用了“链地址法”,就是当两个键的哈希值落到同一个位置时,用一个链表把它们串起来,为了避免在数据量增长时链表过长导致性能下降,Redis会进行“渐进式rehash”,这是个非常聪明的设计:当需要扩容时,它不是一次性把所有数据从旧哈希表搬到新哈希表(那会阻塞服务很久),而是准备两个哈希表(旧表和新表),在后续的每次增删改查请求中,慢慢地、分批地把旧表的数据迁移到新表,这样就把一次性的巨大开销,平摊到了很多次小的操作中,保证了Redis在扩容期间依然能高效响应请求,不会出现卡顿。(来源:Redis设计与实现中关于字典rehash的章节)
你看,Redis的这些数据结构,表面上看就是几种简单的类型,但底层却藏着这么多为了极致性能和节省内存而做的精巧设计,正是这些细节,让Redis从一个简单的键值存储,变成了一个强大而高效的多功能数据平台。

本文由帖慧艳于2026-01-08发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/76764.html
