Redis 解决哈希冲突的方式
-
Redis 通过链式哈希的方式来解决哈希冲突。 链式哈希指的是同一个哈希桶中的多个元素用一个链表来保存,它们依次用指针来进行连接。
-
这里存在一个问题,哈希冲突链上的元素只能
通过指针来进行逐一操作
。哈希表写入的数据越多,哈希冲突可能也会越多,这会导致某些哈希冲突链过长,进而导致整个链上的元素查找耗时长,效率低。 -
因此 Redis 会对哈希表做rehash操作,rehash也就是增加哈希桶的数量,减少每个桶中的元素数目,进而减少单个桶中的元素。
Redis 如何进行 rehash 操作
- Redis 默认使用了两个全局哈希表: 哈希表1 和哈希表2.在一开始的时候,插入数据,默认使用哈希表1,此时的哈希表2并没有被分配空间,随着数据增多,Redis开始执行rehash操作
- rehash 过程主要分为三步
- 给哈希表2分配更大的空间,例如是哈希表1大小的两倍
- 把哈希表1中的数据重新映射到哈希表2之中。(
再给哈希表2拷贝数据,Redis会正常去处理客户端请求,每一个请求执行的时候,都会从哈希表1的第一个索引位置开始,将这个索引位置下面的所有entries 拷贝到哈希表2中;等处理下一个请求的时候,再顺带拷贝哈希表1中的下一个索引位置
)
- 释放哈希表1中的数据