redis内存淘汰策略

Redis 的过期策略用于管理键的生命周期,确保在设定的时间后自动删除键以节省内存资源。过期策略有三种主要机制:

1. 被动过期

  • 定义:当客户端访问一个键时,Redis 会检查该键是否已过期。
  • 原理:如果键已过期,Redis 会立即删除该键,并返回空结果或错误信息。这种方式不会主动检查键是否过期,而是等到访问时才触发删除。
  • 优点:减少了额外的 CPU 开销,因为只在访问键时才执行检查。
  • 缺点:若某个键从未被访问过,则即使已过期,也不会被立即删除,导致内存可能被无效数据占用。

2. 主动过期

  • 定义:Redis 会定期扫描一部分键,以检测并删除过期键。
  • 原理
    • Redis 每秒钟随机抽取 20 个 设置了过期时间的键,并删除其中已过期的键。
    • 这种随机抽样策略能够确保过期键被及时清理,但不会遍历所有键,避免对性能的影响。
  • 优点:主动过期策略确保了一部分过期键能够被及时删除,减少内存占用。
  • 缺点:不能保证所有过期键都能立即被删除,有可能会存在部分键未被及时清理。

3. 内存淘汰策略

  • 定义:当 Redis 内存使用达到上限时,会触发内存淘汰机制,从而删除一些键以释放内存。
  • 可选的淘汰策略
    1. noeviction:不删除任何键,直接返回错误。
    2. allkeys-lru:在所有键中使用 LRU 算法,删除最近最少使用的键。
    3. volatile-lru:在设置了过期时间的键中使用 LRU 算法。
    4. allkeys-random:在所有键中随机删除一些键。
    5. volatile-random:在设置了过期时间的键中随机删除。
    6. volatile-ttl:在设置了过期时间的键中删除最近要过期的键。

4. 内存不足时的清理机制

  • 如果 Redis 的内存即将耗尽,可能会触发内存淘汰策略来保证内存不超限。
  • 淘汰策略会根据配置的策略选项(如 LRU 或 TTL)决定哪些键应被删除,从而腾出内存。

总结

Redis 通过 被动过期主动过期 来尽可能地清理已过期的键,同时通过内存淘汰策略确保在内存不足时进行适当的键删除操作。这些策略的组合使得 Redis 能够在内存使用和性能之间找到一个平衡点。

4o

You said:

内存不足时的清理机制,即使 key 没有过期也是可能被清除对吧

ChatGPT said:

ChatGPT

是的,在 Redis 的内存淘汰策略下,即使某些键没有设置过期时间,也可能会被清除。具体来说,当内存达到最大上限时,Redis 会根据配置的淘汰策略来选择删除的键以释放内存,而不区分键是否设置了过期时间。

内存淘汰策略的详解

Redis 的内存淘汰策略分为几类,其中有些策略在没有过期的键中也会选择性地删除:

  1. allkeys-lru
    • 在所有键(不论是否有过期时间)中使用 LRU(最近最少使用)算法删除最少使用的键。
    • 当内存不足时,Redis 会删除最久未被访问的键来腾出空间。
  2. allkeys-random
    • 在所有键中随机删除一些键。
    • 这种策略也是不区分键是否设置了过期时间,纯粹是随机选择。
  3. volatile-lru
    • 在仅设置了过期时间的键中使用 LRU 算法,删除最近最少使用的键。
    • 这意味着只在有过期时间的键中进行清理,不影响没有过期时间的键。
  4. volatile-random
    • 在仅设置了过期时间的键中随机删除。
  5. volatile-ttl
    • 删除那些即将到期的键,优先清理剩余存活时间最短的键。
  6. noeviction
    • 不删除任何键,直接返回错误,适合希望严格控制内存使用的场景。

小结

  • 当内存达到上限时,allkeys-lruallkeys-random 策略会影响所有键,不论是否设置过期时间。
  • 其他策略(如 volatile-lruvolatile-randomvolatile-ttl)只会针对设置了过期时间的键进行清理。
  • 默认情况下,Redis 不会自动清理没有过期时间的键,但在内存耗尽时,所有键都可能被删除(取决于配置的淘汰策略)。

这些策略使得 Redis 在内存管理上灵活而高效,同时也意味着在内存紧张时,有可能会丢失无过期时间的键。

0 0 投票数
Article Rating
订阅评论
提醒
guest
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x