哈希算法
在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。
哈希表的扩展与收缩
当满足下列条件时,进行哈希