rehash 的过程?

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 持续学习,不断总结,共同进步,活到老学到老
  • 人生的本质是追寻自我的提升,包括思想、能力、意志等等。
  • 直面变化,找到背后更基础的东西,更基础的东西是用户的需求。
  • 我们的成功是我们的现在和将来决定的。今天和明天已经由昨天决定,你还可以决定后天。

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

7.rehash 的过程?

随着操作的不断执行,哈希表保存的键值对会逐渐地增多或者减少,为了让哈希表的负载因子(loadfactor)维持在一个合理的范围之内,当哈希表保存的键值对数量太多或者太少时,程序需要对哈希表的大小进行相应的扩展或者收缩。扩展和收缩哈希表的工作可以通过执行 rehash(重新散列)操作来完成,Redis 对字典的哈希表执行 rehash 的步骤如下:

扩展操作:

  • 当执行哈希表的扩展操作时,即需要将哈希表从当前大小扩展为更大的大小,Redis 会按照如下规则计算新哈希表的大小 ht[1]:
  • ht[1] 的大小为第一个大于等于 ht[0].used * 2 的 2^n(2 的 n 次方幂)。
  • 其中,ht[0] 是当前的原始哈希表,ht[0].used 表示当前哈希表中已使用的槽数量,而 n 是一个非负整数,使得 2^n 大于等于 ht[0].used * 2。
  • 这个规则确保了新哈希表的大小足够大,能够容纳扩展后的数据,并且也有一定的冗余空间,以减少哈希冲突。

收缩操作:

  • 当执行哈希表的收缩操作时,即需要将哈希表从当前大小收缩为更小的大小,Redis 会按照如下规则计算新哈希表的大小 ht[1]:
  • ht[1] 的大小为第一个大于等于 ht[0].used 的 2^n(2 的 n 次方幂)。
  • 同样,ht[0] 是当前的原始哈希表,ht[0].used 表示当前哈希表中已使用的槽数量,n 是一个非负整数,使得 2^n 大于等于 ht[0].used。
  • 这个规则确保了新哈希表的大小足够小,能够适应收缩后的数据,避免过多的内存浪费。

rehash为渐进式:分多次渐进完成扩展收缩,因为如果键值对数量庞大,全部一次性 rehash 会停止服务,通过 rehashidx 来实现.

因为在进行渐进式 rehash 的过程中,字典会同时使用 ht[0]和 ht[1]两个哈希表,所以在渐进式 rehash 进行期间,字典的删除(delete)、查找(find)、更新(update)等操作会在两个哈希表上进行。例如,要在字典里面查找一个键的话,程序会先在 ht[0]里面进行查找,如果没找到的话,就会继续到 ht[1]里面进行查找。诸如此类。

另外,在渐进式 rehash 执行期间,新添加到字典的键值对一律会被保存到 ht[1]里面,而 ht[0]则不再进行任何添加操作,这一措施保证了 ht[0]包含的键值对数量会只减不增,并随着 rehash 操作的执行而最终变成空表。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值