hash地址_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]。
hash地址_redis中的hash扩容、渐进式rehash过程相关推荐
- redis中的hash扩容渐进式rehash过程
背景: redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash 对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度 ...
- hash地址_深入浅出一致性Hash原理
一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...
- Redis之渐进式rehash
渐进式 rehash 上一节说过, 扩展或收缩哈希表需要将 ht[0] 里面的所有键值对 rehash 到 ht[1] 里面, 但是, 这个 rehash 动作并不是一次性.集中式地完成的, 而是分多 ...
- hash地址_一致性Hash在负载均衡中的应用
作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...
- HashMap扩容时的rehash方法中(e.hash oldCap) == 0算法推导
PS:由于文档是我在本地编写好之后再复制过来的,有些文本格式没能完整的体现,故提供下述图片,供大家阅览,以便有更好的阅读体验: HashMap在扩容时,需要先创建一个新数组,然后再将旧数组中的数据转移 ...
- 全网把Map中的hash()分析的最透彻的文章,别无二家。
你知道HashMap中hash方法的具体实现吗?你知道HashTable.ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8 ...
- bat从数组中找出相同数字并删除_全网把Map中的hash()分析的最透彻的文章,别无二家...
原文地址:https://mp.weixin.qq.com/s/qCHkzs4JPOipB-ZzqrfbeQ 作者: Hollis 你知道HashMap中hash方法的具体实现吗? 你知道HashTa ...
- hash地址_hash 算法原理及应用漫谈
本文作者:jeffhe,腾讯 IEG 开发工程师 提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角 ...
- redis的hash怎么实现以及 rehash过程是怎样的?和JavaHashMap的rehash有什么区别,与ConcurrentHashMap扩容的策略比较?
文章为自己不懂的时候,搜集网络相关内容的综合理解,非原创.有些内容稍有改动. =========================================================== 2 ...
最新文章
- linux可以远程装机吗,linux 远程装机
- TFboy养成记 多层感知器 MLP
- 算法练习day8——190326(猫狗队列、转圈打印矩阵、旋转正方形矩阵、反转单向双向链表、数N的加法组合)
- 让自己的代码生成对应的chm帮助文档
- cmd查看端口占用情况 和 关闭被占用的端口
- python爬虫淘宝视频_Python2爬虫:以抓取淘宝MM为例(实战)
- matlab mxarray赋值,C++中数组与MATLAB mxArray相互赋值
- 超定方程的最小二乘解的三维几何解释
- homestead修改php版本
- c语言成绩管理系统的作用,C语言实现班级成绩管理系统
- arch linux安装和dwm窗口管理器安装
- 管理信息系统期末测试题
- 晶体管放大电路之应用
- python 打开网页方法_python打开网页的方法
- 什么是天灾人祸,天灾是智商比较低,什么是人祸,人祸就是自己还不努力
- 计算机监控系统举例,计算机监控体系举例.ppt
- 【华为OD机试】1038 - 学英语
- 谈谈区块链的常用架构
- 用php把图片合成视频,图片音乐合成视频 多张图片合成视频|图片合成视频软件...
- mysql 事件及定时器
热门文章
- docker Redis集群
- Java问题集锦--The type StringEscapeUtils is deprecated
- dubbo之.xml配置文件报错
- 巧妙地在Windows搭建node服务器
- android线性布局快捷键,【整理】Android图形界面知识学习与总结之:Linear Layout线性布局...
- cuda加速的头文件_如何从C ++头文件调用CUDA文件?
- 学计算机的用surface,11个高效利用Surface处理工作学习任务的方法 - Surface 使用教程...
- linux下装sqlserver安装包,【sqlServer】CentOS7.x 上Microsoft SQL Server for Linux安装和配置...
- QT中DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 ()问题的解决
- linux用date指令,Linux中date指令的使用