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的方式,详细步骤如下:
为
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中的hash扩容渐进式rehash过程相关推荐
- hash地址_redis中的hash扩容、渐进式rehash过程
背景: redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash 对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度 ...
- Python操作Redis中的hash
Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). Python的re ...
- 单线程照样飞起 | redis字典快速映射+hash釜底抽薪+渐进式rehash
前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...
- redis中的hash
1.结构 2.接口
- redis的hash怎么实现以及 rehash过程是怎样的?和JavaHashMap的rehash有什么区别,与ConcurrentHashMap扩容的策略比较?
文章为自己不懂的时候,搜集网络相关内容的综合理解,非原创.有些内容稍有改动. =========================================================== 2 ...
- redis渐进式rehash机制
在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的.通过哈希表中的节点保存字典中的键值对.我们知道当HashMap中由于Hash冲 ...
- Redis详解(六)渐进式rehash机制
在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的.通过哈希表中的节点保存字典中的键值对.我们知道当HashMap中由于Hash冲 ...
- Redis中存值是Hash冲突怎么解决的
Redis 中的 Hash和 Java的 HashMap 更加相似,都是数组+链表的结构.当发生 hash 碰撞时将会把元素追加到链表上 我们先来了解下 hash 的内部结构.第一维是数组,第二维是链 ...
- Redis之渐进式rehash
渐进式 rehash 上一节说过, 扩展或收缩哈希表需要将 ht[0] 里面的所有键值对 rehash 到 ht[1] 里面, 但是, 这个 rehash 动作并不是一次性.集中式地完成的, 而是分多 ...
最新文章
- 690啊690,你不是找骂吗?
- mysql bin的过期时间_Mysql设置binlog过期时间并自动删除
- linux进不了容器配置目录,linux – 在Docker容器中使用bcrypt的ELF头文件或安装问题...
- Gartner:2015年SIEM(安全信息与事件管理)市场分析
- 修复计算机的英语,Windows Repair最新版
- 太实用了,4款常用的可视化大屏工具,你一定要知道!
- 用python计算准确率_Pytorch 计算误判率,计算准确率,计算召回率的例子
- NUC1371 Who's in the Middle【中位数+排序】
- HBase在新能源汽车监控系统中的应用
- python实现区间估计,一个正态总体,均值已知,未知的区间估计,正态分布,t 分布
- three.js学习笔记(十五)——着色器图案
- android app 退出功能,Android 完美退出 App (Exit)
- 70个居家做饭小技巧
- 在智能手机上跟踪ADS-B系统的飞机航线信息
- C++8/23——仿照string类,写一个my_string类
- linux如何关闭硬件加速,启用硬件加速是什么意思?如何关闭【详解】
- 奇迹服务器如何修改合成几率,奇迹萌新教程系列-奇迹单双手武器互换修改教程...
- 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...
- 小游戏策划案例精选_趣味小游戏活动方案_趣味游戏活动策划书
- 陆奇首次出手投资量子计算