首页 > 编程知识 正文

Redis 源码解读之 Rehash 的调用时机

时间:2023-05-05 09:55:13 阅读:186005 作者:49

Redis源代码解读的Rehash调用时机背景和问题本文想解决的问题

何时触发Rehash操作? 实际执行Rehash函数的时机是? 结论Rehash操作在什么时候触发?缩容: Redis定时任务serverCron在每个周期检查bucket的使用情况。 如果存储的key数与总bucket数的比率小于hashtable_min_fill(10% ),则会触发Rehash收缩操作。 每次通过调用33558www.Sina.com/:dictaddraw添加数据时,都会检查bucket的使用率。 扩展条件为以下条件之一: dict_can_resize=1(此参数在执行具有COW操作的子进程时更新为0, 当前存储的key数与bucket数的比率超过dict_force_rect数http://www.Sina.com/bucket数(避免内核在子进程操作期间触发Rehash进行大量Page复制操作) 33558 www.Sina.com/:在redis执行dictAddRaw、dictGenericDelete、dictFind、dictGetSomeKeys和dictGetRandomKey等操作之前执行Rehash操作源代码分析dict结构dict结构是Redis的主体,所有用户数据都存在于一个dict中。 dict在整个Redis体系结构中的位置如下:

一个Redis服务有16个redisDb,每个redisDb都有一个数据dict (负责维护实际用户数据)和一个超时dict (负责维护超时时间)。 dict包含两个用于存储数据的散列表dictht。 为渐进式Rehash操作保留了两个dictht。 Rehashidx记录当前的rehash状态。 迭代器维持了当前正在遍历dict的情况,类似于读锁定。 如果该值大于0,则无法执行Rehash操作。 (运行dictScan时,此值加1 ) ) ) ) )。

渐进式Rehash dictRehash实际上执行Rehash操作,代码很简单。 可能是根据新的Hash规则将包含旧词典的bucket冲突链表插入新词典。 其中,参数n指定本轮操作需要迁移的旧词典bucket的数量

运行Rehash的时机扩容

初始化redis server时,将注册计时器事件并定期执行serverCron任务。 关于redis的事件循环机制,有机会单独打开几个博客进行介绍。 不挖洞填埋系列(否) )

计划任务serverCron的工作在源代码中有详细的注释。 例如,触发过期的key操作、监视服务运行状况、更新统计信息、触发渐进式Rehash、BGSAVE/AOF和终止子进程,以及处理客户端超时。

当然这里需要关系的是渐进式Rehash,serverCron通过调用databasesCron函数来实现。 关于其他内容,有机会单独打开几个博客进行介绍。 挖洞系列1 (否) ) ) ) ) ) )。

如果没有子进程进行备份操作,databasesCron将一次检查每个DB中的表,以查看是否需要Rehash。 请参阅上一节。 如果需要Rehash或Rehash中的DB,请用incrementallyRehash进行Rehash。定时任务

incrementallyRehash对数据/超时时间词典分别进行最大1ms的Rehash操作。 如果实际执行Rehash操作,此函数将返回1。

dictRehashMilliseconds每次执行100次渐进式Rehash,然后继续执行ms ms。

附着于其他操作

定时任务:在执行dict时调用_dictRehashStep函数来执行Rehash操作。

一次触发仅执行一次(成功的)渐进式 Rehash 操作。:此函数在执行数据插入操作之前调用_dictRehashStep来执行Rehash操作。

附着于其他操作:此函数在物理或逻辑删除数据之前调用_dictRehashStep执行Rehash操作。

_dictRehashStep:此函数在执行查询数据操作之前调用_dictRehashStep来执行Rehash操作。

dictAddRaw:在数据删除/过期操作时,调用dictgetsomekeys/dictgetrandomkey函数以获取需要操作的key。 这两个函数在获取key之前执行Rehash操作。

触发Rehash的计时dictExpand函数根据当前dict中存储的数据量触发Rehash操作并设置相关参数。 将bucket的数量缩放为_dictnextpower(dict.size )

每次添加key时,dictGenericDelete:都尝试扩大bucket数量。

放大的条件是以下之一:

dict_can_resize=1(此参数在执行具有COW操作的子流程时更新为0,以避免在子流程操作期间触发Rehash。 导致内核执行大量Page复制操作()当前保存的key数与bucket数的比率dict_force_resize_ratio(5)5)dictFind:定时任务set

从源代码中可以看到,如果保存的key数少于bucket数的10%,则会触发收缩Rehash。

参考文献http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /

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