首页/数据/数据库速查/maxmemory 内存上限与 OOM 行为
Redis 运维与场景124 条

maxmemory 内存上限与 OOM 行为

maxmemory 是实例内存红线:达到上限后按策略淘汰;若无可淘汰键则写命令报 OOM,读与 DEL 仍可执行。

数据库速查数据更新于 2026-10-13

maxmemory 是什么

maxmemory 是实例的内存红线,单位字节,0 表示不限制。达到上限后按 maxmemory-policy 淘汰键;若策略不允许淘汰或已无可淘汰键,写命令直接返回 OOM 错误,读命令与 DEL 仍能执行。它统计的是数据与内部开销,不含 fork 时 COW 额外复制出来的页,所以贴近物理内存的实例做快照时仍可能被系统杀掉。

基本信息

单位写法字节数,也支持 1gb / 512mb 这类写法
默认值0,即不限制(生产不建议)
建议值物理内存的 60%-75%,给 fork 与系统留余量
配套参数maxmemory-policy / maxmemory-samples
修改方式CONFIG SET 动态生效,写进配置文件才持久

典型使用场景

  • 纯缓存实例:设上限并配 allkeys-lru,让内存可控且永不满盘
  • 混合实例:只淘汰有过期时间的键,用 volatile-lru 保护常驻数据
  • 排查 OOM 报错:确认 maxmemory 与 used_memory 关系及淘汰是否被禁用
  • 容量规划:结合 used_memory_rss 与碎片率决定扩缩容
  • 大实例快照前的保护:临时降低 maxmemory 给 COW 留内存
  • 客户端缓冲治理:Redis 7.0 起可用 maxmemory-clients 限制连接输出缓冲

查看与设置

查看与设置
CONFIG GET maxmemory          # 0 表示不限制,物理内存保护实际是关闭的
CONFIG SET maxmemory 8gb
CONFIG SET maxmemory-policy allkeys-lru
CONFIG REWRITE                # 把当前值写回配置文件,避免重启失效
INFO memory | grep -E 'used_memory_human|maxmemory_human|maxmemory_policy|mem_fragmentation_ratio'
# 触发上限时客户端会收到:
# (error) OOM command not allowed when used memory > 'maxmemory'.
INFO stats | grep evicted_keys   # 淘汰是否真的在发生

淘汰策略对照

策略淘汰范围适用场景
noeviction不淘汰,写请求报错数据不可丢,宁愿写入失败
allkeys-lru所有键按最近最少使用淘汰纯缓存实例的默认选择
allkeys-lfu所有键按访问频率淘汰热点集中、突发热度场景
volatile-lru仅在设了过期时间的键中淘汰缓存与常驻数据混部
volatile-ttl优先淘汰剩余时间最短的键数据都有明确有效期时
maxmemory 只算数据加开销,不含 fork 时 COW 复制出来的页;所以 maxmemory 贴近物理内存的大实例做快照时仍可能被系统 OOM Killer 干掉。
用 noeviction 又不监控内存,写请求会在内存到顶时集体报错;相反,用 allkeys-lru 却把关键数据也放进同一实例,可能被淘汰。缓存与业务数据建议分实例部署。

易错点

  • maxmemory 保持 0,实例涨到物理内存上限后被系统杀掉,且没有任何淘汰保护
  • 策略设 noeviction 但没做内存告警,写请求突然全量报 OOM
  • 用 allkeys-lru 却把不能丢的数据放在同一实例,被当作缓存淘汰
  • 只调 maxmemory 不调 maxmemory-samples,淘汰精度低导致命中率明显下滑
  • CONFIG SET 后忘记 CONFIG REWRITE 或写配置文件,重启回到旧值

数据来源与参考

  • Redis 官方文档: maxmemory
  • Redis 官方文档: 内存管理

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌