首页 > 编程知识 正文

redis hash原理,redis rehash原理

时间:2023-05-03 05:57:08 阅读:186049 作者:443

在说http://www.Sina.com/Rehash之前,让我们先回顾一下词典的结构

引入/* *词典*/typedef struct dict { //类型本征函数dictType *type; //私人数据void *privdata; //散列表dictht ht[2]; //rehash索引//rehash如果不存在,则值为-1 int rehashidx;/* rehashingnotinprogressifrehashidx==-1 *///当前正在运行的安全迭代器的数量int iterators;/* numberofiteratorscurrentlyrunning */} dict; 3358 www.Sina.com/* thisisourhashtablestructure.everydictionaryhastwoofthisaswe * implementincrementalrehashing, for the old to the new table. *//* *散列表* *通过为每个词典使用两个散列表来实现渐进式rehash。 */typedef struct dictht { //散列表数组dictEntry **table; //散列表大小unsigned long size; //要计算为索引值//始终等于size - 1 unsigned long sizemask的散列表的大小掩码; //此哈希表中现有节点的数量未注册长使用; (} dictht;1.字典dict.h/dict的源码/* *哈希表节点*/typedef struct dictEntry { //密钥void *key; //值union { void *val; uint64_t u64; int64_t s64; ) v; //指向下一个散列表节点,形成链表struct dictEntry *next; (} dictEntry;2.哈希表dict.h/dictht的源码

3358 www.Sina.com/http://www.Sina.com /随着操作的进行,保存在散列表中的密钥对将会逐渐增加或减少。 为了保持散列表的负载率在合适的范围内,如果散列表中保存的键值对数量过多或过少,请展开或折叠散列表。

3.哈希表节点dict.h/dictEntry的源码(1)为字典中的ht[1]哈希表分配空格

在扩展操作的情况下,在ht[1]的大小=ht[0].used*2的2^n收缩操作的情况下,ht[1]的大小=ht[0].used的2^n[2]是保存在ht[0]的所有键值对red。

)3)当ht[0]的所有键值对转移到ht[1]后(ht[0]成为空表),释放ht[0],将ht[1]设定为ht[0],并使用空白的散列表ht[1]

33558www.Sina.com/(1)运行rehash之前的词典

)2) ht(0).used的值为4,与此相对,4*2=8,在此之上的2^n为8,所以将ht )1)的大小设定为8

)3)将ht[0]的所有四个键值对重置为ht[1]。 在这种情况下,ht[0]为空

)4)释放ht[0],将ht[1]设定为ht[0],然后给ht[1]分配空白的散列表,将散列表的大小从4扩展为8

4.一个普通的字典结构(没有进行rehash)当满足以下条件之一时,程序会扩展哈希表

服务器当前没有运行bgsave或bgrewriteaof命令,哈希表加载因子=1服务器当前正在运行bgsave或bgrewriteaof命令,哈希表加载因子=5行

load _ factor=ht [0].used/ht [0].size

如果负载因子值小于0.1,则程序对哈希表进行收缩操作

整个3358 www.Sina.com/http://www.Sina.com/rehash过程不是一次性的,而是分多次逐步完成的。 如果散列表中包含数量巨大的密钥对,则一次运行rehash很可能会导致服务器宕机。

rehash过程图解通过给ht[1]分配空间,使字典具有ht[0]和ht[1]的散列表,维持索引计数器变量rehashidx,并将其值设定为0 如果的rehash是ht[0]的所有键值对都从rehash设置为ht[1],则程序会将rehashidx的值设置为-1以指示rehash操作已完成。 渐进式发行版的优点是,通过将rehash键值对的计算均匀分布在每个词典的添加/删除/修改操作中,可以避免集中式rehash的明显好处

1.进行rehash的原因渐进式rehash之前的词典

rehash索引0中的键值对

rehash索引1中的键值对

rehash索引2中的键值对

rehash索引3中的键值对

渐进式重置完成

我还很肤浅。 如果有错误的话,请指出来。 谢谢你。

如果有更好的建议,可以留言一起讨论,一起进步!

非常感谢您耐心阅读本篇博文。

参考书籍: 《Redis设计与实现(第二版)》 —jmddy

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。