redis扩容面试题有哪些?redis扩容面试题之redis扩容的rehash过程

redis是一个基于内存实现的键值型非关系数据库,在面试java的过程中,redis相关问题是必问的,因此大家在面试之前,都会找redis相关面试题查看,那redis扩容面试题有哪些?接下来我们就来给大家讲解一下这方面的内容。

redis扩容面试题.png

在扩容和收缩的时候,如果哈希字典中有很多元素,一次性将这些键全部rehash到ht[1]的话,可能会导致服务器在一段时间内停止服务。所以,采用渐进式rehash的方式,详细步骤如下:

为ht[1]分配空间,让字典同时持有ht[0]和ht[1]两个哈希表

将rehashindex的值设置为0,表示rehash工作正式开始

在rehash期间,每次对字典执行增删改查操作是,程序除了执行指定的操作以外,还会顺带将ht[0]哈希表在rehashindex索引上的所有键值对rehash到ht[1],当rehash工作完成以后,rehashindex的值+1

随着字典操作的不断执行,最终会在某一时间段上ht[0]的所有键值对都会被rehash到ht[1],这时将rehashindex的值设置为-1,表示rehash操作结束

渐进式rehash采用的是一种分而治之的方式,将rehash的操作分摊在每一个的访问中,避免集中式rehash而带来的庞大计算量。

需要注意的是在渐进式rehash的过程,如果有增删改查操作时,如果index大于rehashindex,访问ht[0],否则访问ht[1]

总结:redis的rehash目的就是redis的扩容时,重新对数据进行hash,也就是原先的hash表 ht[0] (hashtable[0]) 的key进行重新hash,再存到一个全新的hash表中,若要一次性将这些键全部rehash到ht[1](hashtable[1].扩容后的哈希表)的话,会导致服务器在一段时间内停止服务(必须全部rehash过程完成),所以,采用渐进式rehash的方式

渐进式rehash:

为ht[1]分配空间,让字典同时持有ht[0]和ht[1]两个哈希表

将rehashindex的值设置为0,表示rehash工作正式开始

在rehash期间,每次对字典执行增删改查操作是,程序除了执行指定的操作以外,还会顺带将ht[0]哈希表在rehashindex索引上的所有键值对rehash到ht[1],当rehash工作完成以后,rehashindex的值+1

随着字典操作的不断执行,最终会在某一时间段上ht[0]的所有键值对都会被rehash到ht[1],这时将rehashindex的值设置为-1,表示rehash操作结束

渐进式rehash采用的是一种分而治之的方式,将rehash的操作分摊在每一个的访问中,避免集中式rehash而带来的庞大计算量。

需要注意的是在渐进式rehash的过程,如果有增删改查操作时,如果index大于rehashindex,访问ht[0],否则访问ht[1]

(1)上面说了,rehash的时候rehashindex的值设置为0,表示rehash工作正式开始,

(2)当rehash工作完成以后,rehashindex的值+1 , rehashindex >0; 就是说 一个index 一个index的进行key的迁移,每迁移一个index就 rehashindex + 1

所以rehashindex就是已经index< rehashindex的下标对应的链表已经迁移过了,迁移到 ht[1] 上,index > rehashindex 还没迁移,index = rehashindex正在迁移

(3)ht[0]的所有键值对都会被rehash到ht[1],这时将rehashindex的值设置为-1,表示rehash操作结束

有增删改查操作时,如果index大于rehashindex就是还没迁移的index,就访问ht[0](原始的hashtable), 否则就是 已经迁移过的和正在迁移的,都操作新的 ht[1]

redis扩容面试题有哪些?redis扩容面试题之redis扩容的rehash过程.png

redis扩容面试题是面试中高频考点,所以建议面试java工作的,一定要多看这方面的考题,以便帮助你快速通过面试!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。

推荐阅读:

Hibernate映射框架如何工作?Hibernate框架支持哪些数据库?

java如何实现登录业务层?java书写登陆的业务层方法

java泛型方法怎么定义?java泛型有什么作用?