Redis过期键的删除策略
1 问题背景
项目中用到Redis,得了解下Redis过期键的删除策略,他是否能做到实时删除的?
参考自《Redis的设计与实现》这个PDF电子书
2 过期键删除策略
针对过期键的删除策略,有以下3种(这并不代表Redis就用了这3种):
- 定时删除。给每个键都设置一个定时器,时间一到就删除该键。缺点是占用CPU资源。
- 惰性删除。查询该键的时候,先判断是否过期,过期则删除并返回null值给客户端。缺点是不能实时删除,会占用内存资源
- 定期删除。每隔一段时间去扫描键,并删除过期键。难点是确定删除操作执行的时长以及频率。删除操作太频繁或时长太长,定期删除会退化成定时删除,会过多占用CPU时间。删除操作执行太少或时长太短,作用又会和惰性删除一样,出现内存浪费的情况。
3 Redis的实现
采用惰性删除+定期删除。
4 内存淘汰策略
背景:由于Redis采用定期+惰性的过期策略,是无法做到实时删除已过期的键,随着时间推移,服务器的内存将会被占用完。因此我们需要一种策略,当内存满了的时候,怎么腾出内存空间给Redis使用。
Redis提供的内存淘汰策略如下:
-
noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键(Redis默认使用该策略)
-
allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
-
volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
-
allkeys-random:加入键的时候如果过限,从所有key随机删除
-
volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
-
volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
-
volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
-
allkeys-lfu:从所有键中驱逐使用频率最少的键
解释:LRU是最近最久未使用,LFU是最近最少使用。