2. 在渐进式 rehash 执行期间,新添加到字典的键值对一律会被保存到 ht[1] 里面,而 ht[0] 则不再进行任何添加操作:这一措施保证了 ht[0] 包含的键值对数量会只减不增,并随着 rehash 操作的执行而最终变成空表。
2.3 时间复杂度下面给出几个Redis字典常见操作的时间复杂度,可以结合上面的内容分析为什么。
操作 时间复杂度创建一个新字典 O(1)
将给定的键值对添加到字典内 O(1)
将给定的键值对添加到字典内,如果键存在则替换之 O(1)
返回给定键的值 O(1)
从字典中随机返回一个键值对 O(1)
从字典中删除给定键所对应的键值对 O(1)
释放给定字典以及字典中包含的键值对 O(N),N为字典包含的键值对的数量
本文重点
字典在redis中广泛应用,包括数据库和hash数据结构。
每个字典有两个哈希表,一个是正常使用,一个用于rehash期间使用。
当redis计算哈希时,采用的是MurmurHash2哈希算法。
哈希表采用链表法解决散列冲突,被分配到同一个地址的键会构成一个单向链表。
在rehash对哈希表进行扩展或者收缩过程中,会将所有键值对进行迁移,并且这个迁移是渐进式的迁移。
小结本篇文章主要回顾了散列表的概念,散列函数以及如何解决散列冲突。并分析了Redis中字典的实现。下篇文章将介绍跳跃表以及跳跃表在Redis中的实现。
参考《Redis设计与实现》
《Redis开发与运维》
《Redis官方文档》