分析Redis中的字典、哈希算法和ReHash原理

技术分析Redis中的字典、哈希算法和ReHash原理本篇内容介绍了“分析Redis中的字典、哈希算法和ReHash原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处

本文介绍了“Redis中的字典分析、哈希算法和重散列原理”的相关知识。很多人在实际案例的操作中会遇到这样的困难。让边肖带领你学习如何处理这些情况。希望大家认真阅读,学点东西!

分析Redis中的字典、哈希算法和ReHash原理

Redis中的字典被广泛用于实现Redis的各种功能,包括数据库和哈希键。

字典的底层实现为哈希表,每个字典有两个哈希表,一个用于正常使用,另一个用于重新散列扩展。

字典的结构定义

typedefstructdict{

//特定于类型的函数。

dictType * type

//私有数据

void * privdata

//哈希表,两个元素。

字典[2]

//重新散列时记录的索引下标,或者没有重新散列时记录的-1。

internathashidx;

} dict==当执行重新散列时,对于每个迁移的索引,重新散列的条目数据将为1;==

哈希表字典的结构定义为:

typedefstructdictht {

//哈希表数组

dictEntry * *表;

//哈希表大小。

unsignedlongsize

//哈希表大小掩码,用于计算索引值。

unsignedlongsizenask

//哈希表中现有节点的数量。

unsignedlonguesd

} dictht其中,table是一个数组,数组的每个元素都指向一个dictEntry类型的指针,键值对存储在dictEntry类型中。

这里还可以看到,哈希表的节点通过链表连接,解决哈希冲突问题,也就是链地址法。

哈希冲突与哈希算法

为了实现从键到值的快速访问,Redis使用哈希表保存所有键-值对。对应Redis设置的Key,而不对应值本身,而是指向具体值的指针.使用哈希表最大的好处是可以快速找到时间复杂度为O(1)的键值对。但是,既然是散列表,就必然会有哈希冲突.的问题

哈希冲突是指两个密钥的哈希值和哈希桶计算对应关系时,正好落在同一个哈希桶上。

Redis解决哈希冲突的方式是使用链式哈希,或者拉链法.当多个元素指向同一个哈希桶时,使用链表将对应的数据存储在同一个哈希桶中,并通过指针依次连接。

00-1010向字典中添加新的键值对时,程序需要先根据键值对计算哈希值和索引值,然后根据索引值将包含新键值对的哈希表节点放在哈希表数组的指定索引上。

00-1010哈希表中有一个负载因子来控制哈希表中存储的键值对的数量。这需要重新散列操作才能完成。其中,荷载系数的计算公式为:

//加载因子=哈希表中保存的节点数/哈希表的大小。

荷载系数=ht [0]的膨胀和收缩条件。已使用/ht [0]。大小散列表如下:

服务器目前未执行BGSAVE命令或BGREWRITEAOF命令,哈希表加载因子大于等于1;

目前服务器正在执行BGSAVE命令或BGREWRITEAOF命令,哈希表的加载因子大于等于5;

如果满足上述条件之一,将执行重新散列过程。

如果服务器正在执行BGSAVE或BGREWR。

ITEAOF时,Redis会创建当前服务器进程的子进程

rehash的过程大概分为三步:

  • 给哈希表2分配更大的空间,例如是当前哈希表1的两倍;

  • 把哈希表1中的数据重新映射并拷贝到哈希表2中;

  • 释放哈希表1的空间;

其中,第一步分配空间的大小是由当前的rehash操作类型 以及 当前哈希表的键值对数量决定的。

  • 当执行的是扩展操作,分配的空间大小 为第一个大于等于(哈希表的键值对数量 * 2) 的2^n 值;

    假设 当前的键值对数量为4,那么 4 * 2 = 8,因为8 刚好等于2^3,即刚好等于第一个等于2^n的值,所以扩展空间就为 8;

  • 如果执行的是收缩操作,分配的空间大小 为第一个大于等于(哈希表的键值对数量 ) 的2^n 值;

渐进式reHash

      当哈希表数量多时,如果一下子将数据都复制过去,那么就很有可能对服务器造成影响。所以Redis是分多次进行rehash的,也就是渐进式rehash。

      简单来说就是在第二步操作时,Redis仍然正常处理客户端请求,每处理一个请求时,从哈希表1中的第一个索引位置开始,顺带着将这个索引位置上所有的entries元素拷贝到哈希表2中;等下一次请求时,再顺带拷贝下一个索引位置的entries。

      这样就很巧妙地将一次性大量拷贝的开销,分摊到多次处理请求的过程中了,避免了耗时操作,保证了数据的快速访问。

rehash时期间的哈希表操作

      在进行 渐进式rehash操作时,字典的删除、查找、更新等操作会在两个哈希表中执行。例如要在字典中查找一个键的话,会先去原表中进行查询,如果找不到就会去新表查询。

      而字典的添加操作一律只会保存在新表中。

“分析Redis中的字典、哈希算法和ReHash原理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/70314.html

(0)

相关推荐

  • Web前后端分离开发的方法是什么

    技术Web前后端分离开发的方法是什么本篇内容主要讲解“Web前后端分离开发的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Web前后端分离开发的方法是什么”吧!在传

    攻略 2021年11月2日
  • 闯红灯12123多久能显示,闯红灯多久能查到具体车辆

    技术闯红灯12123多久能显示,闯红灯多久能查到具体车辆随着互联网飞速发展,车辆在违章之后,既可到车管所进行违章处理,也可在网上进行处理闯红灯12123多久能显示。那么2018年闯红灯后几天后才能知晓呢?怎么查询呢?接下

    生活 2021年10月31日
  • 牛客网面试题

    技术牛客网面试题 牛客网面试题目录
    一、JAVA
    二、计算机网络
    三、操作系统
    四、项目
    五、数据库
    第六部分 框架
    第七部分 设计模式
    第八部分 数据结构和算法
    第九部分 Linux
    ########

    礼包 2021年12月20日
  • 塑料三角烧瓶,三角烧瓶和三角瓶的区别

    技术塑料三角烧瓶,三角烧瓶和三角瓶的区别一塑料三角烧瓶、应用领域区别:1、三角瓶多用于生物培育菌种实验,有盖。2、三角烧瓶即锥形瓶是化学实验中常见仪器,多无盖,可加热,用于化学实验。
    二、外形区别:
    3、锥形瓶一般来说

    生活 2021年10月26日
  • ubuntu 12.04如何编译sqlite

    技术ubuntu 12.04如何编译sqlite这篇文章将为大家详细讲解有关ubuntu 12.04如何编译sqlite,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。#########

    攻略 2021年11月18日
  • debug E命令怎样改变指定地址的数据实现同时看新旧内容

    技术debug E命令怎样改变指定地址的数据实现同时看新旧内容本篇文章给大家分享的是有关debug E命令怎样改变指定地址的数据实现同时看新旧内容,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收

    攻略 2021年11月11日