一、字典的实现

Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。

1.1 哈希表

Redis字典所使用的哈希表由dict.h/dictht结构定义:
Redis4-字典
table属性是一个数组,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry结构保存着一个键值对。size属性记录了哈希表的大小,也即是table数组的大小,而used属性则记录了哈希表目前已有节点(键值对)的数量。sizemask属性的值总是等于size-1,这个属性和哈希值一起决定一个键应该被放到table数组的哪个索引上面。

下图展示了一个大小为4的空哈希表:
Redis4-字典

1.2 哈希表节点

哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存着一个键值对:
Redis4-字典
Redis4-字典
下图展示了如何通过next指针,将两个索引值相同的k1和k0连接在一起:
Redis4-字典

1.3 字典

Redis中的字典由dict.h/dict结构表示:
Redis4-字典
Redis4-字典
Redis4-字典

下图展示了一个普通状态下(没有进行rehash)的字典:
Redis4-字典

二、哈希算法

Redis4-字典

三、解决键冲突

Redis4-字典
Redis4-字典
Redis4-字典

四、rehash

Redis4-字典
举个例子,假如程序要对下图所示的字典h[0]进行扩展操作,那么程序将执行以下步骤:
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典

五、渐进式rehash

Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典
Redis4-字典

相关文章:

  • 2022-12-23
  • 2021-06-08
  • 2021-05-24
  • 2021-11-08
  • 2022-12-23
  • 2021-10-31
  • 2021-12-22
  • 2022-12-23
猜你喜欢
  • 2021-08-19
  • 2021-10-07
  • 2022-12-23
  • 2021-08-24
  • 2021-05-28
  • 2022-02-04
  • 2021-06-26
相关资源
相似解决方案