Redis删除策略和淘汰策略
一、Redis数据过期清除策略
如果我们设置了Redis的key-value的过期时间,当缓存中的数据过期之后,Redis就需要将这些数据进行清除,释放占用的内存空间。Redis中主要使用 定期删除 + 惰性删除 两种数据过期清除策略。
1、定期删除
redis默认每隔100毫秒就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。如果有多于25%的key过期,重复上述步骤。
2、惰性删除
在你获取某个key的时候,Redis会检查一下,如果这个key设置了过期时间并且过期了,就删除。
定期删除+惰性删除存在的问题:
如果某个key过期后,定期删除没删除成功,然后也没再次去请求key,也就是说惰性删除也没生效。这时,如果大量过期的key堆积在内存中,Redis的内存会越来越高,导致Redis的内存块耗尽。那么就应该采用内存淘汰机制。
二、内存淘汰策略
淘汰策略 | 描述 |
---|---|
noeviction(默认策略) | 不会删除任何数据,拒绝所有写入操作并返回客户端错误消息(error)OOM command not allowed when used memory,此时 Redis 只响应删和读操作 |
allkeys-lru | 从所有 key 中使用 LRU 算法进行淘汰(LRU 算法:最近最少使用算法) |
allkeys-lfu | 从所有 key 中使用 LFU 算法进行淘汰(LFU 算法:最不常用算法,根据使用频率计算,4.0 版本新增) |
allkeys-random | 从所有 key 中随机淘汰数据 |
volatile-lru | 从设置了过期时间的 key 中使用 LRU 算法进行淘汰 |
volatile-lfu | 从设置了过期时间的 key 中使用 LFU 算法进行淘汰 |
volatile-random | 从设置了过期时间的 key 中随机淘汰数据 |
volatile-ttl | 在设置了过期时间的key中,淘汰过期时间剩余最短的 |