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

hash地址_redis中的hash扩容、渐进式rehash过程相关推荐

  1. redis中的hash扩容渐进式rehash过程

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

  2. hash地址_深入浅出一致性Hash原理

    一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...

  3. Redis之渐进式rehash

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

  4. hash地址_一致性Hash在负载均衡中的应用

    作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...

  5. HashMap扩容时的rehash方法中(e.hash oldCap) == 0算法推导

    PS:由于文档是我在本地编写好之后再复制过来的,有些文本格式没能完整的体现,故提供下述图片,供大家阅览,以便有更好的阅读体验: HashMap在扩容时,需要先创建一个新数组,然后再将旧数组中的数据转移 ...

  6. 全网把Map中的hash()分析的最透彻的文章,别无二家。

    你知道HashMap中hash方法的具体实现吗?你知道HashTable.ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8 ...

  7. bat从数组中找出相同数字并删除_全网把Map中的hash()分析的最透彻的文章,别无二家...

    原文地址:https://mp.weixin.qq.com/s/qCHkzs4JPOipB-ZzqrfbeQ 作者: Hollis 你知道HashMap中hash方法的具体实现吗? 你知道HashTa ...

  8. hash地址_hash 算法原理及应用漫谈

    本文作者:jeffhe,腾讯 IEG 开发工程师 提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角 ...

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

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

最新文章

  1. linux可以远程装机吗,linux 远程装机
  2. TFboy养成记 多层感知器 MLP
  3. 算法练习day8——190326(猫狗队列、转圈打印矩阵、旋转正方形矩阵、反转单向双向链表、数N的加法组合)
  4. 让自己的代码生成对应的chm帮助文档
  5. cmd查看端口占用情况 和 关闭被占用的端口
  6. python爬虫淘宝视频_Python2爬虫:以抓取淘宝MM为例(实战)
  7. matlab mxarray赋值,C++中数组与MATLAB mxArray相互赋值
  8. 超定方程的最小二乘解的三维几何解释
  9. homestead修改php版本
  10. c语言成绩管理系统的作用,C语言实现班级成绩管理系统
  11. arch linux安装和dwm窗口管理器安装
  12. 管理信息系统期末测试题
  13. 晶体管放大电路之应用
  14. python 打开网页方法_python打开网页的方法
  15. 什么是天灾人祸,天灾是智商比较低,什么是人祸,人祸就是自己还不努力
  16. 计算机监控系统举例,计算机监控体系举例.ppt
  17. 【华为OD机试】1038 - 学英语
  18. 谈谈区块链的常用架构
  19. 用php把图片合成视频,图片音乐合成视频 多张图片合成视频|图片合成视频软件...
  20. mysql 事件及定时器

热门文章

  1. docker Redis集群
  2. Java问题集锦--The type StringEscapeUtils is deprecated
  3. dubbo之.xml配置文件报错
  4. 巧妙地在Windows搭建node服务器
  5. android线性布局快捷键,【整理】Android图形界面知识学习与总结之:Linear Layout线性布局...
  6. cuda加速的头文件_如何从C ++头文件调用CUDA文件?
  7. 学计算机的用surface,11个高效利用Surface处理工作学习任务的方法 - Surface 使用教程...
  8. linux下装sqlserver安装包,【sqlServer】CentOS7.x 上Microsoft SQL Server for Linux安装和配置...
  9. QT中DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 ()问题的解决
  10. linux用date指令,Linux中date指令的使用