redis快的秘诀--渐进式rehash
- 什么是rehash
当我们创建一个hashMap的时候,我们一般会设置参数:初始化容量,以及负载因子,当hash表中的负载因子达到负载极限的时候,hash表会自动成倍的增加容量(桶的数量),并将原有的对象重新的分配并加入新的桶内,这称为rehash。这个过程是十分好性能的 - Redis的全局哈希表
为了实现从键值对的快速访问,redis使用了哈希表来保存所有的键值对,一个哈希表就是一个数组,数组里面的每一个元素就称为一个哈希桶,所以一个哈希表就是由多个哈希桶组成的,每个哈希桶中保存了键值对数据
- Rehash带来的性能问题
当redis进行rehash的时候,如果数据有上万条 ,百万条一起进行rehash,数据移动的过程,就一定会阻塞redis,在阻塞的过程中,就会导致很多请求阻塞 - Redis的解决方案:渐进式哈希
原理:把一次大的数据拷贝移动,分配到很多次处理请求中来
如下:把表1的数据移动到表2,第一次客户端请求就移动第一个位置的元素计算位置并移动到第二张大表,每一步rehash结束,都要增加索引值,并且把旧表中已经迁移完毕的bucket置为空指针,第二次客户端请求就移动第二个位置上的元素。。。。。。直到最后把所有的数据移动完成,回收空间,重置旧表,重置渐进式哈希的索引
所以:我们在rehash的过程中,数据其实是保存在两张表的,一张表没有就会去寻找下一张表