返回信息流redis实现分布式锁是通过过期键实现的,看redis过期键的实现对于redis定期删除策略的实现有几个疑问,不知道为什么这样设计,有没有大神为小弟解答一下,万分感谢。
按照redis的expire.c中activeExpireCycle函数实现的过期键定期删除策略,从数据库中的expire字典中随机检查一部分键的过期时间,并删除其中的过期键。
疑问1:为什么是随机检查,不是按照一定规则遍历整个过期字典
疑问2:为什么每次只检查一部分,源码是20
#define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20 /* Loopkups per loop. */
疑问3: 当过期键删除超过1/4(5个),停止遍历当前数据库实例,切换到下一个数据库实例。这样设计的好处是什么呢
...
/* We don't repeat the cycle if there are less than 25% of keys found expired in the current DB. */
} while (expired > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP/4);
这是一条镜像帖。来源:北邮人论坛 / database / #11088同步于 2018/12/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
关于Redis过期键定期删除的疑问
Jiangshui
2018/12/11镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
试着回答一下
随机记得是redis做过测试,这种方式和真正严格的按照时间排序进行删除并没有很大的差别,但是性能和复杂度俩种却差别很大;
每次选择20个应该是因为redis是的单进程,后台启动了很多定时任务,如果一个任务耗时久的话就会卡住主进程,影响接受新的请求,所以很多后台定时任务都会严格限制每次执行的时间;