Redis通过链式哈希解决键的冲突,也就是同一个桶里面的元素使用链表保存,但当链表过长时会导致查询性能变差,所以Redis使用了两个全局哈希表,用于rehash(重新哈希)操作,增加现有的哈希桶数量,减少哈希冲突。
开始默认使用1号哈希表保存键值对数据,2号哈希表尚未分配空间,当数据越来越多时将会触发rehash操作,执行以下操作:
- 为2号哈希表分配更大的存储空间。
- 将1号哈希表的数据拷贝到2号哈希表中,并重新建立hash映射。
- 释放1号哈希表的空间。
将1号哈希表的数据重新映射到2号哈希表的过程中并不是一次性的,这样会造成Redis阻塞。而是采用了渐进式rehash,每次处理客户端请求的时候,将1号哈希表的部分内容拷贝至2号哈希表中,将rehash操作分散在多次请求过程中,避免耗时阻塞。