跳到主要内容
约 3 分钟3 张卡

Redis 内存淘汰

Redis 内存淘汰在内存压力下选择删除对象。本文以 Redis 6、7 为基线,负责策略、候选范围与内存观测。

1. 面试核心​

先记住这几条,再读正文

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 等指标留出余量。

6. 参考资料​