redis集群中maxmemory必须为每个节点单独配置,不能统一设置;未设或设错会导致部分节点oom或写入失败,而其他节点仍正常,易引发线上事故。

Redis 6.2 集群中,maxmemory 必须为每个节点单独设置,不能通过集群命令统一配置;不设或设错会导致部分节点 OOM 或写入失败,而其他节点仍正常——这种不对称行为是线上事故的常见源头。
每个节点都要单独执行 CONFIG SET
Redis 集群没有“全局内存配置”概念,redis-cli -c 的集群模式只转发读写请求,不转发 CONFIG 类管理命令。你连上任意一个节点执行 config set maxmemory 2gb,仅该节点生效。
- 先用
redis-cli -c cluster nodes获取所有主节点地址(注意过滤出master且不含fail状态的行) - 对每个主节点 IP:Port 单独连接:
redis-cli -h 127.0.0.1 -p 7001 - 依次执行:
config set maxmemory 2gb和config set maxmemory-policy volatile-lru - 用
config get maxmemory验证返回值是字节数(如"2147483648"),不是字符串"2gb"
volatile-lru 在集群中实际只作用于带 EXPIRE 的 key
选 volatile-lru 意味着:只有设置了过期时间的 key 才参与 LRU 淘汰;如果业务中大量缓存没设 TTL(比如用 SET 直接写入),这些 key 永远不会被清理,maxmemory 形同虚设,最终触发 noeviction 行为(写操作报 (error) OOM command not allowed when used memory > 'maxmemory')。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 检查是否有 key 没设过期时间:
redis-cli -h 127.0.0.1 -p 7001 --scan --pattern '*' | xargs -I {} redis-cli -h 127.0.0.1 -p 7001 ttl {} | grep -v "^-1$" | wc -l(统计有 TTL 的 key 数) - 若返回接近 0,说明几乎没设过期时间,
volatile-lru失效,应改用allkeys-lru或强制业务加 TTL -
volatile-lru的 LRU 是近似实现(采样 5 个 key 比较 lru 字段),不是全量排序,所以“最久未用”只是概率性结果
配置文件里必须写绝对字节数或带单位的字符串,但单位不区分大小写
redis.conf 中写 maxmemory 2GB、maxmemory 2gb、maxmemory 2147483648 效果一致;但运行时 CONFIG GET 返回的永远是纯数字(字节),别指望看到单位。
- 单位支持:
b、kb、mb、gb、tb,不支持g或Gb这类不标准写法(会解析失败,日志报Invalid argument) - 6.2 版本中,如果
maxmemory设为0,表示不限制(64 位系统下可能耗尽物理内存) - 修改
redis.conf后必须重启节点,或先CONFIG REWRITE再CONFIG SET,否则热加载不生效
最容易被忽略的是:集群节点间内存使用完全独立,maxmemory 不是整个集群的总和限制;一个节点打满不影响其他节点响应,但客户端重定向可能失败——尤其当某节点因淘汰策略激进导致 key 大量丢失时,MOVED 重定向会反复跳转到空数据节点。










