数据结构
使用全局哈希
- 目的:用 O(1) 的时间复杂度来快速查找到键值对
新的问题:哈希表的冲突问题和 rehash 可能带来的操作阻塞
解决:Redis 解决哈希冲突的方式,就是链式哈希
新的问题:数据越大,某些哈希冲突链过长,查找耗时长,效率降低
解决:rehash,使用两个全局哈希表
步骤:
- 给哈希表 2 分配更大的空间,例如是当前哈希表 1 大小的两倍;
- 把哈希表 1 中的数据重新映射并拷贝到哈希表 2 中;
- 释放哈希表 1 的空间。
新的问题:大量的数据拷贝,可能会造成 Redis 线程阻塞,无法服务其他请求。
解决:采用渐进式 rehash
步骤:
- 在上面第二步拷贝数据时,Redis 仍然正常处理客户端请求,每处理一个请求时,从哈希表 1 中的第一个索引位置开始,顺带着将这个索引位置上的所有 entries 拷贝到哈希表 2 中;等处理下一个请求时,再顺带拷贝哈希表 1 中的下一个索引位置的entries。(没有键值对操作,redis会有一个定时任务执行rehash,缩短整个rehash过程)
好处:
- 把一次性大量拷贝的开销,分摊到了多次处理请求的过程中,避免了耗时操作,保证了数据的快速访问