Redis过期策略和淘汰机制

112 阅读2分钟

通过 expire key seconds 命令来设置数据的过期时间。返回1表明设置成功,返回0表明设置失败。在key上设置了过期时间后key将在指定的秒数后被自动删除。

通过 ttl key命令来查看数据的过期时间

通过 persist key命令来可以清除数据的过期时间

Redis使用懒惰删除+定期删除相结合的方式处理过期的key。

● 惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key(对内存不友好,对CPU友好)

● 定期删除:每隔一段时间需要进行抽取一定数量的设置过期的key,过期了就会删除,限制删除操作的开销,减少了删除操作对CPU的影响,缺点是内存清理效果不太好,定期的度不好把控,如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好;如果执行的太少,那又和惰性删除一样了,过期 key 占用的内存不会及时得到释放。

● 当前已用内存超过maxmemory限定时,触发主动清理策略 (内存淘汰机制)

定期删除策略

Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所有的数据,非常消耗 CPU 资源,并且当 key 已过期,但是定时器还处于未唤起状态,这段时间内 key 仍然可以用。

惰性删除策略

在获取 key 时,先判断 key 是否过期,如果过期则删除。这种方式存在一个缺点:如果这个 key 一直未被使用,那么它一直在内存中,其实它已经过期了,会浪费大量的空间。

内存淘汰策略

  1. 不进行内存淘汰策略,触发OOM
  2. 进行数据淘汰的策略:
    1. volatile-random:随机淘汰设置了过期时间的key
    2. volatile-ttl:淘汰更早过期的key
    3. volatile-LRU:最近最少使用的被淘汰
    4. volatile-LFU:在LRU的基础上加上频率,最少使用的key被淘汰
    5. allKeys-random:所有的key随机淘汰
    6. allKeys-LRU
    7. allKeys-LFU

在配置文件redis.conf中的参数maxmemory控制发生内存淘汰的阈值,如果值为0,就不会进行内存检查

ps:

Redis 数据过期策略 - danielzzz - 博客园

Redis 过期删除策略和内存淘汰策略有什么区别? | 小林coding