过期策略
- 定时过期(主动淘汰),
- Redis未使用
- 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除
- 可以立即清除过期的数据,对内存很友好
- 但是会占用大量的CPU资源去处理过期的数据,影响缓存的响应时间和吞吐量
-
惰性过期(被动淘汰)
- 只有当访问一个key时,才会判断该key是否已过期,过期则清除
- 可以最大化地节省CPU资源,却对内存非常不友好,极端情况可能有大量过期key没有再次被访问,从而不会被清除,占用大量内存
-
定期过期
- 每隔一定时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key
- 该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果
Redis 中同时使用了惰性过期和定期过期两种过期策略
Redis中定期过期策略算法大致实现
- redis.config中hz定义了serverCron任务的执行周期,默认为10,即CPU空闲时每秒执行10次
- 每次过期key清理的时间不超过CPU时间的25%,即若hz=1,则一次清理时间最大为250ms,若hz=10,则一次清理时间最大为25ms
- 清理时依次遍历所有的db
- 从db中随机取20个key,判断是否过期,若过期,则逐出
- 若有5个以上key过期,则重复步骤4,否则遍历下一个db
- 在清理过程中,若达到了25%CPU时间,退出清理过程
淘汰策略
淘汰策略 | 含义 |
---|---|
volatile-lru | 根据 LRU 算法删除设置了超时属性(expire)的键,直到腾出足够内存为止。如果没有可删除的键对象,回退到 noeviction 策略。 |
allkeys-lru | 根据 LRU 算法删除键,不管数据有没有设置超时属性,直到腾出足够内存为止。 |
volatile-lfu | 在带有过期时间的键中选择最不常用的。 |
allkeys-lfu | 在所有的键中选择最不常用的,不管数据有没有设置超时属性。 |
volatile-random | 在带有过期时间的键中随机选择。 |
allkeys-random | 随机删除所有键,直到腾出足够内存为止。 |
volatile-ttl | 根据键值对象的 ttl 属性,删除最近将要过期数据。如果没有,回退到 noeviction 策略。 |
noeviction | 默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOMcommand not allowed when used memory,此时 Redis 只响应读操作 |
建议使用 volatile-lru,在保证正常服务的情况下,优先删除最近最少使用的 key
在 redis.conf 中
# maxmemory-policy noeviction
配置淘汰策略