首页 > 编程知识 正文

热哈是什么意思,rehash toolboxcache

时间:2023-05-05 06:37:20 阅读:186046 作者:2359

Redis的词典是与Rehash的初次见面概念,是以散列表为基础实现的。 一个散列表中可以有多个散列表节点,每个散列表节点都包含词典中的一对键值。

散列表中的键值对通过重复操作进行增减。 为了使散列表的负载率保持在更合适的范围内,程序需要适当地扩展或缩小散列表的大小。 可以通过“重新散列”操作来完成此操作。

要让Redis对词典的散列表执行rehash,请执行以下操作: 为词典中的ht[1]哈希表分配空格。 此哈希表的空间大小取决于要执行的操作,ht[0]中当前包含的键值对的数量(即ht[0].used属性的值) :如果执行扩展操作,ht[1]的大小将首先增大,然后执行收缩操作

将保存在ht[0]中的所有键值对从rehash放置在ht[1]上。 rehash是重新计算密钥的哈希值和索引值,并将密钥值对放置在ht[1]哈希表中的指定位置。

ht[0]中包含的所有键值对都迁移到ht[1]后,ht[0]将成为空表。 释放ht[0],将ht[1]设定为ht[0],在ht[1]中创建新的空哈希表,为下一个rehash做准备。

当满足以下条件之一时,程序自动开始对哈希表执行扩展操作:

服务器当前没有运行BGSAVE或BGREWRITEAOF命令,散列表的负载率大于或等于1。 服务当前正在运行BGSAVE或BGREWRITEAOF命令,散列表的负载因子为5或更大,其中散列表的负载因子为负载因子=散列表已保存节点数/散列表大小http://www .

例如,在大小为4、键和值对为4的散列表中,该散列表的负载因子为load_factor=4/4=1

例如,对于大小为512且具有256个值-值对的散列表,该散列表的负载因子为load_factor=256/512=0.5

服务器执行扩展操作所需的负载百分比取决于是否执行了BGSAVE或BGREWRITEAOF命令。 这是因为在运行BGSAVE或BGREWRITEAOF命令时,Redis需要为当前服务器进程创建子进程。 大多数操作系统都采用了写时复制技术来优化子进程的使用效率,以便在子进程存在时,服务器可以提高执行扩展操作所需的负载率,并在子进程存在时进行散列这样可以避免不必要的内存写入操作,最大限度地节约内存。

另一方面,在散列表的负载率小于0.1的情况下,程序自动开始散列表的收缩操作。

Rehashing rehash操作分多次分阶段进行。 因为,如果ht[0]只存储了四个键值对,则服务器可以立即将这些键值对从所有rehash变为ht[1]。 然而,如果散列表中存储的键值对的数量是400万、4000万甚至4亿个键值对而不是4个,那么当一次将这些键值对从所有rehash变为ht[1]时,由于巨大的计算量,服务器

load_factor = ht[0].used / ht[0].size

ht[1]分配空格,以使字典具有ht[0]和ht[1]的散列表。 如果在词典中保留索引计数器变量rehashidx并将该值设置为0,则rehash作业将正式开始。 在执行rehash的过程中,每次对词典执行添加、删除、搜索或更新操作时,程序不仅会执行指定的操作,还会将ht[0]哈希表的rehashidx索引上的所有键值从rehash添加到ht[0] rehash工作完成后,程序将rehashidx属性的值加1。 执行字典操作时,最终会在某个时刻将ht[0]的所有键值对从rehash设置为ht[1]。 在这种情况下,程序将rehashidx属性的值设置为-1,以指示rehash操作已完成。 渐进式rehash的优点是,通过按添加、删除、搜索和更新词典操作拆分rehash键值和所需的计算,可以避免集中rehash带来的巨大计算量。

步骤:

准备开始rehash

rehash索引0中的键值对

rehash索引1中的键值对

rehash索引2中的键值对

rehash索引3中的键值对

rehash执行完毕

《Redis设计与实现》

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