741 字
4 分钟
Redis 内存满了怎么办?有哪些淘汰策略?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?本文
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Redis 超过 maxmemory 后如何处理,取决于 maxmemory-policy。内存满了不等于所有写入都自动失败,也不等于一定删除最旧的 Key。 下表列出 Redis 7.x 常见的八种经典策略;新版本新增的策略应查看对应版本配置。

策略怎么选?#

策略候选范围与选择方式
noeviction不淘汰,需要增加内存的写命令可能报错
allkeys-lru所有 Key 中近似淘汰最近最少使用的
allkeys-lfu所有 Key 中近似淘汰使用频率较低的
allkeys-random所有 Key 中随机选
volatile-lru只在带 TTL 的 Key 中按近似 LRU 选择
volatile-lfu只在带 TTL 的 Key 中按近似 LFU 选择
volatile-random只在带 TTL 的 Key 中随机选
volatile-ttl优先淘汰剩余 TTL 较短的候选 Key

纯缓存实例通常允许丢缓存并回源,可考虑 allkeys-lru 或 allkeys-lfu,再根据访问分布和命中率评估。既存缓存又存不能随意丢失的数据时,volatile 策略只有在正确规划 TTL 的前提下才有意义;更清晰的做法往往是按业务职责隔离实例。没有合格的带 TTL 候选 Key 时,volatile 策略也可能无法释放内存并返回错误。

maxmemory 为什么不能直接等于机器内存?#

Redis 进程的 RSS、操作系统和其他进程的内存、复制/AOF 缓冲、后台 fork 的写时复制峰值,都需要余量。用于触发淘汰的统计也不简单等于 RSS;部分复制和 AOF 缓冲内存不纳入相同的淘汰计算,避免淘汰产生复制数据进而不断放大缓冲。

排查时一起看 INFO memory、INFO stats 中的使用量、内存上限、evicted_keys 和命中情况。淘汰次数增长但命中率稳定,可能是正常缓存行为;命中率下降并带来数据库压力,则应检查容量、TTL、BigKey 与业务流量。

常见追问#

noeviction 下 GET 也失败吗?#

并非所有命令失败。读取一般仍可工作,释放内存的操作也有用;主要风险是需要增加内存的写入被拒绝,应用必须处理错误。

设置 TTL 就能保证内存不会满吗?#

不能。写入速度可能高于过期回收速度,过期时间也可能过长;同时要设置容量上限并规划淘汰或业务限额。

锁和计数器能跟普通缓存共用淘汰实例吗?#

需要谨慎。锁被提前淘汰可能破坏互斥,计数器丢失可能影响限流。应隔离关键协调数据,且不能把 Redis 当成唯一业务正确性保障。

为什么淘汰了很多 Key,RSS 没有立刻下降?#

内存分配器可能保留空闲页,碎片和后台任务也会影响 RSS。要区分逻辑数据减少与操作系统看到的驻留内存减少。

Redis 内存满了怎么办?有哪些淘汰策略?
https://blog.xqcherry.top/posts/interview/redis/redis-memory-eviction/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0