Redis过期策略以及内存淘汰机制
目录
过期策略
过期策略: 定期删除 + 惰性删除
定期删除,redis 默认每个 100ms 检查,是否有过期的 key, 有过期 key 则删除。redis 不是 每个 100ms 将所有的 key 检查一次,而是随机抽取进行检查 (如果每隔 100ms, 全部 key 进行检查,redis 岂不是卡 死)。因此,如果只采用定期删除策略,会导致很多 key 到时间没有删除。 惰性删除则是在获取某个 key 的时候,redis 会检查一下,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
如果定期删除没删除 key。也没有在没请求过期 key, 也就是说惰性删除也没生效。这样 redis 的内存会越来越高。那么就应该采用内存淘汰机制。 在 redis.conf 中有一行配置: maxmemory-policy volatile-lru
内存淘汰策略
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。allkeys-lru:当内存不足以容纳新写入数据时,移除最近最少使用的 key。allkeys-random:当内存不足以容纳新写入数据时,随机移除某个 key。volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。这种情况一般是把 redis 既当缓存,又 做持久化存储的时候才用。volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。不推荐
如果没有设置 expire 的 key, 不满足先决条件, 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction 基本上一致。