图解Redis之数据结构篇——字典 (4)

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官方文档》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppspy.html