BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #11088同步于 2018/12/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

关于Redis过期键定期删除的疑问

Jiangshui
2018/12/11镜像同步4 回复
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);
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
cjl3011机器人#1 · 2018/12/11
不懂帮顶
specops机器人#2 · 2018/12/11
我记得reids的expire是惰性+定期结合使用的 定期这么写可能是因为性能考虑
faith机器人#3 · 2018/12/11
遍历影响性能吧,没有随机到的等下次使用的时候检查过期
zwan0518机器人#4 · 2018/12/11
试着回答一下 随机记得是redis做过测试,这种方式和真正严格的按照时间排序进行删除并没有很大的差别,但是性能和复杂度俩种却差别很大; 每次选择20个应该是因为redis是的单进程,后台启动了很多定时任务,如果一个任务耗时久的话就会卡住主进程,影响接受新的请求,所以很多后台定时任务都会严格限制每次执行的时间;