redis源码阅读--hashTable

公司有个项目用到hash,同事从redis的代码里抠了hashTable的源码出来,最近抽空看了一下,设计还是很精妙的。 现在把阅读的结果写写,以备后面复习可用(记得之前看过一次,后来长时间没看了就忘记了,这次再看基本要从头开始)

源码位置
图示

(摘自redis设计与实现) 参考这里 dict

设计思路
  • 这个hash(字典)他包含了两个table,为什么有两个呢?那是因为他要实现自动扩展,每次要add新元素的时候都要 判断一下是否需要扩展(expand)
  • 两个table再挂上2的倍数(size) 的桶,每个桶都是一个链表。
  • 当达到条件需要扩展的时候,一般是元素的个数和桶的比例差不多是1:1, 那就将第一个table生成第一个的size *2 为什么要是2的倍数呢?有几个好处:1.分布更均匀 2.碰撞几率更小 但是还有一个更重要的原因是: a%b可以替换成了a&(b-1) ,当hashtable的长度是2的幂的情况下。这样运算速度可以提高很多,具体可以参考这里
  • 当新的table生成后,桶数扩大了一倍,这样就大大地减少了碰撞,但是就带来了一个原来的数据是rehash的问题
  • 当rehash开始后,如果有增,删,查的操作,每次都搬一个桶到新的table上,如果已经开始rehash,那么,新增的元素就直接插到新的桶上
  • 当rehash全部完成后,旧talbe释放掉,新table接替旧table成为主力工作。
  • 还给hash设置了迭代器(iterators), 当有迭代器存在的时候,为了安全就不进行rehash的步骤。
参考资料

转载于:https://my.oschina.net/mawx/blog/893393

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值