Redis哈希键冲突问题

哈希算法

在Redis的字典中,当要将一个新的键值对添加字典时,需将键值对的键计算出哈希值和索引,由得出的哈希值决定放在哈希表数组的哪个索引上。

哈希冲突

当两个或以上数量的键被分到哈希表数组同一个位置时,键就发生冲突。

解决哈希冲突

Redis哈希表采用链地址法解决键冲突,每个哈希表的节点会有next指针,被分到同一个位置的键值对节点就会使用单链表连接起来。
如图:

在这里插入图片描述

rehash

哈希表保存的键值对会逐渐增多或减少,哈希表会让负载因子维持在一个合理范围,如果键值对太少或者太多,都需要对哈希表大小进行或收入。
通过rehash可对哈希表扩展或收缩:

1.为字典ht[1]哈希表分配空间

2.如果是扩展,则ht[1]大小等于第一个大于等于ht[0].used*2的2的N次方幂,
如果是收缩,则ht[1]大小为第一个大于或等于ht[0].used的2的N次方幂。

3.将保存在ht[0]中的键值对rehash到ht[1]上

4.当ht[0]包含键值对都迁移到ht[1]之后,释放ht0,将ht[1]设为ht[0],并在ht[1]创建一个新的空白哈希表,为了下次rehash。

哈希表的扩展与收缩

当满足下列条件时,进行哈希

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值