顺风车运营研发团队 方波
一 相关命令:
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函数开始的时间
快速模式:如果上次函数没有触发 timelimit_exit ,那么不执行处理。如果距离上次执行未够一定时间,那么不执行处理,并记录当前时间
函数处理的微秒时间上限,ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 默认为 25 ,也即是 25 % 的 CPU 时间,(server.hz/1000000) * (timelimit) <= 25
server.hz是每秒可以执行的次数,除以10万,就是每个微妙可以执行的次数,timelimit是每次的时间限制,二者相乘要小于给定的阈值
开始遍历数据库
随机查找key,如果正在 rehash,那么将 1 号哈希表也作为随机查找的目标,
rehash过程中的hash计算:random 对(ht[0]和ht[1]的size之和,减去已经rehash的数量,这部分hash值才是有效数据)取模,再加上rehash的数量
获取he的时候,如果计算的hash值大于ht[0],表示在ht[1]中
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。