背景: 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]。

redis中的hash扩容渐进式rehash过程相关推荐

  1. hash地址_redis中的hash扩容、渐进式rehash过程

    背景: redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash 对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度 ...

  2. Python操作Redis中的hash

    Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿).  Python的re ...

  3. 单线程照样飞起 | redis字典快速映射+hash釜底抽薪+渐进式rehash

    前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...

  4. redis中的hash

    1.结构 2.接口

  5. redis的hash怎么实现以及 rehash过程是怎样的?和JavaHashMap的rehash有什么区别,与ConcurrentHashMap扩容的策略比较?

    文章为自己不懂的时候,搜集网络相关内容的综合理解,非原创.有些内容稍有改动. =========================================================== 2 ...

  6. redis渐进式rehash机制

    在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的.通过哈希表中的节点保存字典中的键值对.我们知道当HashMap中由于Hash冲 ...

  7. Redis详解(六)渐进式rehash机制

    在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的.通过哈希表中的节点保存字典中的键值对.我们知道当HashMap中由于Hash冲 ...

  8. Redis中存值是Hash冲突怎么解决的

    Redis 中的 Hash和 Java的 HashMap 更加相似,都是数组+链表的结构.当发生 hash 碰撞时将会把元素追加到链表上 我们先来了解下 hash 的内部结构.第一维是数组,第二维是链 ...

  9. Redis之渐进式rehash

    渐进式 rehash 上一节说过, 扩展或收缩哈希表需要将 ht[0] 里面的所有键值对 rehash 到 ht[1] 里面, 但是, 这个 rehash 动作并不是一次性.集中式地完成的, 而是分多 ...

最新文章

  1. 690啊690,你不是找骂吗?
  2. mysql bin的过期时间_Mysql设置binlog过期时间并自动删除
  3. linux进不了容器配置目录,linux – 在Docker容器中使用bcrypt的ELF头文件或安装问题...
  4. Gartner:2015年SIEM(安全信息与事件管理)市场分析
  5. 修复计算机的英语,Windows Repair最新版
  6. 太实用了,4款常用的可视化大屏工具,你一定要知道!
  7. 用python计算准确率_Pytorch 计算误判率,计算准确率,计算召回率的例子
  8. NUC1371 Who's in the Middle【中位数+排序】
  9. HBase在新能源汽车监控系统中的应用
  10. python实现区间估计,一个正态总体,均值已知,未知的区间估计,正态分布,t 分布
  11. three.js学习笔记(十五)——着色器图案
  12. android app 退出功能,Android 完美退出 App (Exit)
  13. 70个居家做饭小技巧
  14. 在智能手机上跟踪ADS-B系统的飞机航线信息
  15. C++8/23——仿照string类,写一个my_string类
  16. linux如何关闭硬件加速,启用硬件加速是什么意思?如何关闭【详解】
  17. 奇迹服务器如何修改合成几率,奇迹萌新教程系列-奇迹单双手武器互换修改教程...
  18. 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...
  19. 小游戏策划案例精选_趣味小游戏活动方案_趣味游戏活动策划书
  20. 陆奇首次出手投资量子计算

热门文章

  1. 本地字体库的引入方法
  2. 【Linux环境基础开发工具】软件包管理器-yum
  3. 使用VBS制作小程序,提醒记录每日工作
  4. Fritzing软件绘制Arduino面包板接线图传感器模块库文件299
  5. ADMM——交替方向乘子法
  6. BigInteger实际用法
  7. 在JB/JB2版本上找不到Camera图标
  8. AddressSanitizer的错误输出分析
  9. NLP之TEA之NB/LoR:基于NB和LoR算法对Kaggle IMDB影评数据集(国外类似豆瓣电影)情感分析进行分类
  10. [BUUCTF]第六天训练日志