Redis 缓存淘汰策略

一、概述

缓存淘汰策略是在 Redis 达到最大内存限制时,决定哪些数据需要被移除以便为新数据腾出空间的策略。

这些策略通过配置文件或命令进行设置, 以保证 Redis 在有限的内存环境下能够平稳运行。

二、各种淘汰策略介绍

Redis提供了8种淘汰策略,可以分成两大类:

1、针对所有键的策略:对所有键进行选择和淘汰。

2、仅针对有过期时间的键的策略:只在设置了过期时间的键中选择淘汰对象。

以下具体策略:

1. noeviction

  • 描述:达到内存限制时,不再执行删除操作,直接拒绝所有写入请求(包括插入和更新)。

  • 适用场景:希望数据永不丢失的场景,但需要保证内存充足,否则会导致写入操作失败。

2. allkeys-lru(最近最少使用)

  • 描述:在所有的键中使用 LRU算法,删除最近最少使用的键。

  • 适用场景:适合缓存场景,保留频繁访问的键,逐出很少被访问的键。

3. allkeys-lfu(最少使用频率)

  • 描述:在所有键中使用 LFU 算法,删除使用频率最低的键。

  • 适用场景:适用于需根据使用频率进行淘汰的场景,更关注访问次数而非访问时间。

4. volatile-lru(最近最少使用)

  • 描述:仅对设置了过期时间的键使用 LRU 算法。

  • 适用场景:适合缓存一些有过期时间的数据,希望根据访问频率来进行内存管理的场景。

5. volatile-lfu(最少使用频率)

  • 描述:仅对设置了过期时间的键使用 LFU算法。

  • 适用场景:同 volatile-lru,但更关注使用频率

6. allkeys-random

  • 描述:在所有键中随机选择删除某个键。

  • 适用场景:适用于缓存数据访问频率没有明显差异的情况。

7. volatile-random

  • 描述:在所有设置了过期时间的键中随机选择删除某个键。

  • 适用场景:适合缓存带有过期时间的数据,删除哪个数据不重要的场景。

8. volatile-ttl

  • 描述:在设置了过期时间的键中,优先删除剩余生存时间(TTL)较短的键。

  • 适用场景:适合希望优先清理即将过期的数据的场景。

三、内存淘汰策略的配置

Redis提供两种配置方式:

  • 配置文件修改:在redis.conf配置文件中修改

    # 最大内存配置(不设置maxmemory或者设置为0的时候对内存使用没有限制)
    maxmemory 100mb
    # 淘汰策略配置
    maxmemory-policy allkeys-lru
  • 命令设置

    设置最大内存(不设置maxmemory或者设置为0的时候对内存使用没有限制)

    config set maxmemory 1000 

    获取当前内存淘汰策略

    config get maxmemory-policy  

    修改淘汰策略

    config set maxmemory-policy allkeys-lru  

四、缓存淘汰工作原理

1、客户端执行新命令新增数据。

2、Redis 检查内存使用情况,如果超出限制根据策略驱逐 key。

3、完成新命令的执行,并重复上述过程。

因此,我们不断跨越内存限制的边界,通过超过内存限制,然后淘汰策略回到限制以下。

五、总结

根据不同的应用场景,开发者可以选择合适的策略来确保 Redis 在内存达到上限时,能够高效地管理数据并维持系统的稳定性。

 

官方文档:Key eviction | Docs (redis.io)

posted on 2024-10-17 16:49  春与青溪长  阅读(42)  评论(0编辑  收藏  举报