You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Compose限制Redis的内存与CPU资源占用?

解决Redis容器耗尽内存及CPU占用过高的问题

核心问题分析

你当前配置里的mem_reservation: 1G只是软内存预留,Docker只会在调度时优先为容器分配这个额度,但不会强制限制容器的最大内存使用。加上Redis默认不限制自身内存占用,才会出现占满服务器内存的情况;CPU 100%大概率是内存耗尽后触发磁盘swap,或者Redis一直在处理内存回收相关操作导致的。

两步解决:Docker硬限制 + Redis自身内存管控

要彻底解决这个问题,需要同时从Docker层面做强制资源约束,以及让Redis自身主动管控内存:

1. Docker Compose添加硬资源限制

在docker-compose.yml里添加内存和CPU的硬限制参数:

  • mem_limit:强制限制容器最大可用内存(新版Docker Compose也可以用deploy.resources.limits)
  • cpus:限制容器可使用的CPU核心数,避免占满服务器CPU

2. 配置Redis内存上限与淘汰策略

在Redis启动命令里添加:

  • --maxmemory <额度>:设置Redis自身的最大内存(建议比Docker限制小10%-20%,留足容器系统开销)
  • --maxmemory-policy <策略>:内存达到上限时的键淘汰策略,推荐用allkeys-lru(淘汰最近最少使用的键)

修改后的完整docker-compose.yml示例

cache:
  mem_reservation: 1G
  mem_limit: 2G  # 硬限制容器最大内存
  cpus: "1.5"    # 限制CPU使用不超过1.5核
  networks:
    - be-network
  image: redis:latest
  command: redis-server --save 60 1 --loglevel warning --maxmemory 1.8G --maxmemory-policy allkeys-lru
  volumes:
    - cache:/data
  restart: always

额外说明

  • 如果用的是Docker Compose 3.x版本,推荐用deploy字段配置资源限制(更规范):
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '1.5'
        reservations:
          memory: 1G
    
  • 选择合适的淘汰策略:如果你的缓存是临时数据,allkeys-lru最通用;如果是有过期时间的键,也可以用volatile-lru只淘汰带过期时间的键。
  • CPU占用过高的问题,在内存限制生效后,因为避免了swap操作,会自然缓解;如果还是高,需要排查是否有大量高频读写请求,或者Redis的持久化配置是否合理(你当前的--save 60 1表示60秒内有1次写操作就触发RDB持久化,频繁持久化也会占CPU,可以根据业务调整)。

内容的提问来源于stack exchange,提问作者itinance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:12:46