【Redis学习笔记】2018-06-05 Redis中key主动失效实现

顺风车运营研发团队 方波
一 相关命令:
EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT、SETEX、PSETEX

二 实现方式
1 被动失效:key被访问时如果发现它已经失效就删除

2 主动失效:周期性地从设置了失效时间的主键中选择一部分失效的主键删除

三 关键代码段
expire.c

activeExpireCycle:函数尝试删除数据库中已经过期的键,当带有过期时间的键比较少时,函数运行得比较保守,如果带有过期时间的键比较多,那么函数会以更积极的方式来删除过期键,从而可能地释放被过期键占用的内存。每次循环中被测试的数据库数目不会超过 REDIS_DBCRON_DBS_PER_CALL。如果 timelimit_exit 为真,那么说明还有更多删除工作要做,那么在 beforeSleep() 函数调用时,程序会再次执行这个函数。

过期循环的类型:

    如果循环的类型为 ACTIVE_EXPIRE_CYCLE_FAST ,那么函数会以“快速过期”模式执行,执行的时间不会长过 EXPIRE_FAST_CYCLE_DURATION 毫秒,并且在 EXPIRE_FAST_CYCLE_DURATION 毫秒之内不会再重新执行。

    如果循环的类型为 ACTIVE_EXPIRE_CYCLE_SLOW ,那么函数会以“正常过期”模式执行,函数的执行时限为 REDIS_HS 常量的一个百分比,这个百分比由 REDIS_EXPIRELOOKUPS_TIME_PERC 定义。

静态变量,用来累积函数连续执行时的数据, dbs_per_call默认每次处理的数据库数量,start函数开始的时间

《【Redis学习笔记】2018-06-05 Redis中key主动失效实现》

快速模式:如果上次函数没有触发 timelimit_exit ,那么不执行处理。如果距离上次执行未够一定时间,那么不执行处理,并记录当前时间

《【Redis学习笔记】2018-06-05 Redis中key主动失效实现》

函数处理的微秒时间上限,ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 默认为 25 ,也即是 25 % 的 CPU 时间,(server.hz/1000000) * (timelimit) <= 25

server.hz是每秒可以执行的次数,除以10万,就是每个微妙可以执行的次数,timelimit是每次的时间限制,二者相乘要小于给定的阈值

《【Redis学习笔记】2018-06-05 Redis中key主动失效实现》

开始遍历数据库

《【Redis学习笔记】2018-06-05 Redis中key主动失效实现》

《【Redis学习笔记】2018-06-05 Redis中key主动失效实现》

随机查找key,如果正在 rehash,那么将 1 号哈希表也作为随机查找的目标,

rehash过程中的hash计算:random 对(ht[0]和ht[1]的size之和,减去已经rehash的数量,这部分hash值才是有效数据)取模,再加上rehash的数量

获取he的时候,如果计算的hash值大于ht[0],表示在ht[1]中

《【Redis学习笔记】2018-06-05 Redis中key主动失效实现》

    原文作者:LNMPR源码研究
    原文地址: https://segmentfault.com/a/1190000015335204
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞