Redis 的过期策略用于管理键的生命周期,确保在设定的时间后自动删除键以节省内存资源。过期策略有三种主要机制:
1. 被动过期
- 定义:当客户端访问一个键时,Redis 会检查该键是否已过期。
- 原理:如果键已过期,Redis 会立即删除该键,并返回空结果或错误信息。这种方式不会主动检查键是否过期,而是等到访问时才触发删除。
- 优点:减少了额外的 CPU 开销,因为只在访问键时才执行检查。
- 缺点:若某个键从未被访问过,则即使已过期,也不会被立即删除,导致内存可能被无效数据占用。
2. 主动过期
- 定义:Redis 会定期扫描一部分键,以检测并删除过期键。
- 原理:
- Redis 每秒钟随机抽取 20 个 设置了过期时间的键,并删除其中已过期的键。
- 这种随机抽样策略能够确保过期键被及时清理,但不会遍历所有键,避免对性能的影响。
- 优点:主动过期策略确保了一部分过期键能够被及时删除,减少内存占用。
- 缺点:不能保证所有过期键都能立即被删除,有可能会存在部分键未被及时清理。
3. 内存淘汰策略
- 定义:当 Redis 内存使用达到上限时,会触发内存淘汰机制,从而删除一些键以释放内存。
- 可选的淘汰策略:
- noeviction:不删除任何键,直接返回错误。
- allkeys-lru:在所有键中使用 LRU 算法,删除最近最少使用的键。
- volatile-lru:在设置了过期时间的键中使用 LRU 算法。
- allkeys-random:在所有键中随机删除一些键。
- volatile-random:在设置了过期时间的键中随机删除。
- volatile-ttl:在设置了过期时间的键中删除最近要过期的键。
4. 内存不足时的清理机制
- 如果 Redis 的内存即将耗尽,可能会触发内存淘汰策略来保证内存不超限。
- 淘汰策略会根据配置的策略选项(如 LRU 或 TTL)决定哪些键应被删除,从而腾出内存。
总结
Redis 通过 被动过期 和 主动过期 来尽可能地清理已过期的键,同时通过内存淘汰策略确保在内存不足时进行适当的键删除操作。这些策略的组合使得 Redis 能够在内存使用和性能之间找到一个平衡点。
4o
You said:
内存不足时的清理机制,即使 key 没有过期也是可能被清除对吧
ChatGPT said:
ChatGPT
是的,在 Redis 的内存淘汰策略下,即使某些键没有设置过期时间,也可能会被清除。具体来说,当内存达到最大上限时,Redis 会根据配置的淘汰策略来选择删除的键以释放内存,而不区分键是否设置了过期时间。
内存淘汰策略的详解
Redis 的内存淘汰策略分为几类,其中有些策略在没有过期的键中也会选择性地删除:
- allkeys-lru:
- 在所有键(不论是否有过期时间)中使用 LRU(最近最少使用)算法删除最少使用的键。
- 当内存不足时,Redis 会删除最久未被访问的键来腾出空间。
- allkeys-random:
- 在所有键中随机删除一些键。
- 这种策略也是不区分键是否设置了过期时间,纯粹是随机选择。
- volatile-lru:
- 在仅设置了过期时间的键中使用 LRU 算法,删除最近最少使用的键。
- 这意味着只在有过期时间的键中进行清理,不影响没有过期时间的键。
- volatile-random:
- 在仅设置了过期时间的键中随机删除。
- volatile-ttl:
- 删除那些即将到期的键,优先清理剩余存活时间最短的键。
- noeviction:
- 不删除任何键,直接返回错误,适合希望严格控制内存使用的场景。
小结
- 当内存达到上限时,
allkeys-lru
和allkeys-random
策略会影响所有键,不论是否设置过期时间。 - 其他策略(如
volatile-lru
、volatile-random
、volatile-ttl
)只会针对设置了过期时间的键进行清理。 - 默认情况下,Redis 不会自动清理没有过期时间的键,但在内存耗尽时,所有键都可能被删除(取决于配置的淘汰策略)。
这些策略使得 Redis 在内存管理上灵活而高效,同时也意味着在内存紧张时,有可能会丢失无过期时间的键。