Redis 中能写入的数据是有限的,对于过期的数据必须删除以释放资源,一般的我们采用的是定期删除+惰性删除策略。
定期删除
定期删除,Redis 默认每个 100ms 检查,有过期 Key 则删除。需要说明的是,Redis 不是每个 100ms 将所有的 Key 检查一次,而是随机抽取进行检查。
惰性删除
如果只采用定期删除策略,会导致很多 Key 到时间没有删除。于是,惰性删除派上用场。
如果定期删除和惰性删除都没有生效,就要采用内存淘汰机制了,这个在redis.conf文件中有配置,默认的策略是不删除(noeviction)。
maxmemory-policy allkeys-lru
内存淘汰机制分为如下几种:
noeviction:不淘汰
当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru(Least recently used):全数据集中使用最近最少淘汰策略
当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。(推荐使用,这种策略符合我们大多数的生产场景)。
volatile-lru(Least recently used):已设置过程时间的数据集中使用最近最少淘汰策略
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。
allkeys-lfu(Least frequently used) 全数据集中最不经常使用淘汰策略
判定在最近一段时间内使用的次数最少,那在将来一段时间使用的可能性也很小。
volatile-lfu(Least frequently used) 已设置过程时间的数据集中最不经常使用淘汰策略
和allkeys-lfu一样,只是是在已设置过期时间的数据集中生效。
allkeys-random:全数据集中随机删
当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key,这种策略一般不会使用。
volatile-random:从已设置过期时间的数据集中随机删
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key,和allkeys-random理由一样,一般不推荐使用。
volatile-ttl:已设置过期时间的数据集
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。(不推荐)