学习笔记10.14

rehash算法

rehash是为了让哈希表的负载因子维持在一个合理的范围之内,是在哈希表保存的键值对数量太多或者太少的时候,对哈希表的大小进行的扩展或者收缩操作。负载因子load_factor = ht[0].used/ht[0].size。

Redis的字典有两个哈希表,ht[0]和ht[1]。一般情况下字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用。

4.5渐进式rehash

详细步骤:

(1)为ht[1]分配空间,让字典同时持有ht[0]和ht[1]两个哈希表。

(2)在字典中维持一个索引计数器变量rehashidx,并将它的值设置为0,表示rehash工作正式开始。

(3)在rehash期间,每次对字典进行添加、删除、查找或者更新操作时,程序除了执行指定操作外,还会顺带把ht[0]哈希表在rehashidx索引上的所有键值rehash到ht[1],当rehash工作完成后,程序将rehashidx属性的值增一。

(4)最终在某个时间点,ht[0]的所有键值对都被rehash到ht[1],这时把rehashidx属性值设为-1,表示rehash操作完成。

渐进式rehash的好处在于它采取分而治之的方式,将rehash键值对所需的计算工作均摊到对字典的每个添加、删除、查找和更新操作上,从而避免了集中式rehash而带来的庞大计算量。

在渐进式rehash期间,如果要在字典里查找一个键,程序会现在ht[0]查找,如果没找到,就会继续到ht[1]查找。新添加到字典的键值对会一律保存到ht[1]里面,ht[0]不再进行任何添加操作,保证ht[0]键值对数量只减不增,随着rehash的操作最终变成一张空表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值