Redis高频面试题:redis中的hash扩容渐进式rehash过程

Posted androidstarjack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis高频面试题:redis中的hash扩容渐进式rehash过程相关的知识,希望对你有一定的参考价值。

点击上方关注 “终端研发部

设为“星标”,和你一起掌握更多数据库知识

背景:redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash

对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度变为原来的二倍,将原hash表数据全部重新计算hash地址,重新分配位置,达到rehash目的

redis中的hash表采用的是渐进式hash的方式:

1、redis字典(hash表)底层有两个数组,还有一个rehashidx用来控制rehash

2、初始默认hash长度为4,当元素个数与hash表长度一致时,就发生扩容,hash长度变为原来的二倍

3、redis中的hash则是执行的单步rehash的过程:

每次的增删改查,rehashidx+1,然后执行对应原hash表rehashidx索引位置的rehash

总结:

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

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

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

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

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

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

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

作者:沐雨金霖
链接:https://blog.csdn.net/qq_38262266/article/details/107727116
来源:csdn

补充一下 Redis的字典由 dict.h/dict 结构如下(rehash的重点)

typedef struct dict {

    //类型特性函数
    dictType *type;

    //私有数据
    void *privdata;

    //哈希表
    dictht ht[2];

    //rehash索引
    //当rehash没有进行时为-1
    int trehashidx;
}

ht 属性是一个包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下使用的都是ht[0]的哈希表,而ht[1]的哈希表只会在rehash的时候使用。

随着操作的进行,哈希表中的键值对会逐渐增多或减少,这时为了让哈希表负载因子位置在一个合理的范围之内就会对哈希表大小进行扩展或收缩即rehash。

BAT等大厂Java面试经验总结 想获取 Java大厂面试题学习资料扫下方二维码回复「BAT」就好了回复 【加群】获取github掘金交流群回复 【电子书】获取2020电子书教程回复 【C】获取全套C语言学习知识手册回复 【Java】获取java相关的视频教程和资料回复 【爬虫】获取SpringCloud相关多的学习资料回复 【Python】即可获得Python基础到进阶的学习教程回复 【idea破解】即可获得intellij idea相关的破解教程关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!



回复 【idea激活】即可获得idea的激活方式
回复 【Java】获取java相关的视频教程和资料
回复 【SpringCloud】获取SpringCloud相关多的学习资料
回复 【python】获取全套0基础Python知识手册
回复 【2020】获取2020java相关面试题教程
回复 【加群】即可加入终端研发部相关的技术交流群
阅读更多
为什么HTTPS是安全的
因为BitMap,白白搭进去8台服务器...
《某厂内部SQL大全 》.PDF
字节跳动一面:i++ 是线程安全的吗?
大家好,欢迎加我微信,很高兴认识你!
在华为鸿蒙 OS 上尝鲜,我的第一个“hello world”,起飞!

相信自己,没有做不到的,只有想不到的在这里获得的不仅仅是技术!



如果喜欢就给个“在看”

以上是关于Redis高频面试题:redis中的hash扩容渐进式rehash过程的主要内容,如果未能解决你的问题,请参考以下文章

Redis高频面试题汇总(2021最新版)

Redis高频面试题汇总(上)

大厂面试系列吊打面试官之Redis高频面试题(最新版)

高频 Redis 面试题Redis 事务是否具备原子性?

高频 Redis 面试题Redis 事务是否具备原子性?

Redis高频面试题整理(含答案解析)