过期键的删除策略
1. 定时删除
概念:
- 在设置键的过期时间的同时,为每一个键设置一个***定时器***,让定时器在键的过期时间来临时立即执行键的删除操作。
优点:
- 内存友好型
缺点:
- 对CPU不友好, 删除过期键需要占用CPU的一些时间,在CPU资源严重紧张的情况下会对服务器的 吞吐量 和 响应时间 造成严重影响。
- 创建定时器需要用到Redis服务器中的定时事件,而当前时间的实现是基于无序列表的,查找一个事件的时间复杂度为
O(n)
,无法高效处理大量的事件。
2.惰性删除
概念
- 放任过期键不管,只有在每次键的取出时才检查当前键的过期性。
优点
- CPU友好型,CPU仅仅执行当前键的删除操作。
缺点
- 内存不友好型,无用的过期键占用了大量的空间,造成***内存泄漏***。
定期删除
概念
- 每过一段时间对数据库进行一次检查,删除其中的一些过期键, 但是检索那些数据库以及何时检索以及删除那些过期键则由固定的算法决定。
- 定期删除是定时删除和惰性删除的折中权衡。
2.现存的难点
- 确定删除操作的频率以及每次操作执行(花费)的时间。
Redis过期键的删除策略
实现:
惰性删除+定期删除
1.惰性删除
- 惰性删除的实现由
ExpiredIfNeeded
函数实现,Redis在进行键的检查之后,如果过期则调用此函数。
2.定期删除
- 定期删除通过
ActiveExpireCycle
函数实现,当服务器周期性操作函数时,就会在规定的时间内遍历服务器中的各个数据库,从数据库中的expires
中随机检查一部分键的过期时间,并删除其中的过期键。