大家好,今天咱们聊聊 Redis 里面的一个很有意思的现象:ziplist 和 hashtable 之间“身份切换”的故事。 就像咱们人类一样,数据在不同的场景下也需要不同的“活法”,Redis 为了极致的性能和内存效率,就搞出了这么一套灵活的编码转换机制。 开场:Redis 的“双面”数据结构 Redis 里面的数据结构,比如 Hash,List,Set,Sorted Set,表面上看起来就那么几个,但实际上,它们内部可没那么简单。为了在不同的场景下达到最佳的性能和内存占用,Redis 偷偷地给它们披上了不同的“马甲”,也就是内部对象编码。 举个例子,一个 Hash,可能一开始用的是 ziplist(压缩列表)来存储,但随着数据的膨胀,它又会“变身”成 hashtable(哈希表)。这种“变身”可不是随便发生的,它是有条件的,今天咱们就来扒一扒 Hash 在 ziplist 和 hashtable 之间切换的那些事儿。 主角登场:ziplist 和 hashtable 在深入转换条件之前,咱们先来简单认识一下今天的主角:ziplist 和 hashtable。 ziplist(压缩列 …
Redis `hashtable` 内部:字典的哈希冲突解决与渐进式 Rehash
好的,直接开始! 各位观众,欢迎来到“Redis Hash Table的秘密花园”讲座!今天咱们就来扒一扒Redis hashtable的内裤…啊不,是内部实现,重点聊聊哈希冲突和渐进式Rehash这两个有趣的话题。 一、字典的本质:Key-Value存储的基石 Redis字典,也就是dict类型,是Redis最核心的数据结构之一。它干的事情很简单:存储键值对(key-value pairs)。但它背后的实现可不简单,因为它需要足够快、足够稳,才能撑起Redis高性能的半边天。 Redis字典的底层实现,核心就是一个hashtable(哈希表)。 想象一下,你有一个巨大的数组,每个数组元素可以存放一个键值对。 但问题来了:你如何快速地找到某个key对应的value呢? 难道要一个一个遍历数组? 那效率也太低了! 这时候,哈希函数就登场了! 它的作用就是:将key转换成一个整数(哈希值),这个哈希值就对应着数组的下标。这样,我们就可以直接通过哈希值找到对应的数组元素,也就是找到了对应的键值对。 用代码来表示一下,大概是这个样子: typedef struct dictEntry { vo …