Redis中所有的数据结构都可以设置过期时间,时间一到就被自动删除。
过期的 key 集合
redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,redis采用定时遍历这个字典来删除到期的 key 以及惰性删除过期key, 惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。
定时扫描策略
每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。
- 从过期字典中随机 20 个 key;
- 删除这 20 个 key 中已经过期的 key;
- 如果过期的 key 比率超过 1/4,那就重复步骤 1;
为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。
从库不会进行过期扫描,从库对过期的处理是被动的。主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的key。
懒惰删除
在客户端访问key的时候检查是否过期,如果过期就del删除释放内存,通常情况下这个指令比较快,但如果删除的时候一个包含了千万的hash,就会导致主线程卡顿;所以redis在4.0提供了 unlink 丢给后台线程异步处理。 flushdb 和 flushall 用来清空数据库,可以在这两个指令后面添加 async 来异步执行。

主线程会把需要回收的Key放入到异步任务队列中,后台线程会从这个异步任务队列中取任务回收对象。
原文链接: http://herman7z.site