Redis 内存淘汰
Redis 内存淘汰在内存压力下选择删除对象。本文以 Redis 6、7 为基线,负责策略、候选范围与内存观测。
1. 面试核心
先记住这几条,再读正文- 候选范围。 allkeys 从全部键选候选,volatile 只从带过期时间的键中选候选。卡 · 面试核心
- 拒绝写入。
noeviction保留键,内存不足时拒绝相关写入命令。卡 · 策略与候选范围 - LRU 与 LFU。 Redis 的 LRU 按近期访问采样,LFU 按衰减后的近似频率选择。卡 · 面试核心
- 内存上限。
maxmemory约束淘汰判断使用的内存,进程 RSS 还包含其他开销。卡 · 内存用量与观测
2. 策略与候选范围
Redis 6、7 提供以下八种策略。
| 策略 | 候选与依据 |
|---|---|
allkeys-lru | 全部键中,近似选择最久未使用者。 |
allkeys-lfu | 全部键中,选择衰减后低频者。 |
allkeys-random | 从全部键中随机选择。 |
volatile-lru | 从带 TTL 的键中按 LRU 选择。 |
volatile-lfu | 从带 TTL 的键中按 LFU 选择。 |
volatile-random | 从带 TTL 的键中随机选择。 |
volatile-ttl | 从带 TTL 的键中优先选择临近到期者。 |
noeviction | 保留键,内存不足时拒绝相关写入。 |
volatile 策略缺少可淘汰候选时,行为与 noeviction 相同。内存已不足时,需要增加内存的写入会失败。带 TTL 的键也能在到期前因淘汰消失。
3. 内存用量与观测
maxmemory 用于判断是否触发淘汰。它与进程 RSS 存在不同统计口径。内存分配器碎片、复制与 AOF 缓冲都会占用额外内存。后台保存期间,写时复制也会增加宿主机占用。
INFO memory 的 mem_not_counted_for_evict 显示排除项。复制和 AOF 缓冲的部分内存不计入淘汰判断。否则淘汰产生的传播记录又会触发更多淘汰。
观察 used_memory、used_memory_rss 和宿主机剩余量。evicted_keys 记录淘汰次数,expired_keys 记录过期删除次数。再结合命中率、写入错误和回源量判断影响。
4. 使用边界
纯缓存实例可比较 allkeys-lru 与 allkeys-lfu。LRU 适合近期访问能预测后续访问的负载。LFU 用近似计数与衰减追踪访问频率,能适应热点变化。
maxmemory-samples 调整采样精度与 CPU 成本。Redis 6、7 默认值为 5。LFU 还受 lfu-log-factor 和 lfu-decay-time 影响。策略效果需按实际访问分布比较命中率。
权威业务状态应与可淘汰缓存分开规划。noeviction 只改变内存不足时的写入行为。持久化与恢复仍需独立设计。
5 · 面试题卡片
本页题目与参考回答
5.1 Redis 的内存淘汰策略有哪些,LRU 与 LFU 如何选择?
考察重点:候选范围、访问时间与频率、数据丢失影响。
参考回答
Redis 6、7 有 allkeys 和 volatile 两类候选范围。
两类各有 LRU、LFU 和 random 策略。volatile 还提供 TTL 优先,另有 noeviction。
LRU 看近期访问,LFU 看衰减后的近似频率。两者需按负载比较命中率和 CPU 成本。noeviction 会在内存不足时拒绝相关写入。
5.2 volatile-lru 实例没有任何键设置 TTL,内存满后会怎样?
考察重点:候选范围与写入错误。
相关内容:策略与候选范围。
参考回答
它没有可淘汰候选,行为与 noeviction 相同。
需要新增内存的相关写入会失败。读取和释放内存的操作仍可执行。可重建缓存可评估 allkeys 策略,或设置合理 TTL。
5.3 设置 maxmemory 后,为什么进程或宿主机内存仍能超出该值?
考察重点:淘汰口径、缓冲区、碎片与写时复制。
相关内容:内存用量与观测。
参考回答
maxmemory 用于淘汰判断,并非进程 RSS 的硬限制。
部分复制和 AOF 缓冲被排除,分配器也有碎片。后台持久化的写时复制还会增加宿主机内存。因此需结合 mem_not_counted_for_evict 等指标留出余量。