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 却把关键数据也放进同一实例,可能被淘汰。缓存与业务数据建议分实例部署。