Redis 过期策略和缓存淘汰策略

Posted by icoding168 on 2020-04-07 17:29:50

分类: Redis  

过期策略

Redis 采用的过期策略是定时删除 + 惰性删除。

定时删除

定时删除是指 Redis 每隔一段时间随机抽查一些设置了过期时间的 key,如果 key 过期了就删除。为什么要随机抽查呢,因为如果 key 的数量很多,导致 Redis 把资源都消耗在遍历和删除过期数据上,那就会影响其它业务逻辑的正常运行。

惰性删除

惰性删除是指 Redis 在获取数据的时候对 key 进行检查,如果 key 是设置了过期时间的并且已经过期,那么 Redis 就会删除掉这个 key。Redis 的定时删除策略可能会导致很多过期的 key 没有被及时删除掉,惰性删除可以解决这个问题。

缓存淘汰策略

缓存空间的容量是有限的,当有新的数据要进入缓存空间时,如果缓存空间不足就必须按照缓存淘汰策略淘汰掉一些数据。 而且定时删除结合惰性删除并不能全面而及时地删除过期数据,如果有大量的过期数据堆积在缓存中,也会导致 Redis 的可用内存耗尽。

Redis 缓存淘汰策略有以下几个:

  • noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错
  • allkeys-lru:在主键空间中,优先移除最近未使用的 key
  • volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的 key
  • allkeys-random:在主键空间中,随机移除某个 key
  • volatile-random:在设置了过期时间的键空间中,随机移除某个 key
  • volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的 key 优先移除

volatile-lru 是 Redis 默认采用的缓存淘汰策略。