在 Docker 中运行 Redis 需同时设置 redis.conf 的 maxmemory 和 Docker 的 --memory 参数,形成双保险:前者控制 Redis 内存使用策略,后者限制容器总内存,避免 OOM 和雪崩。

在 Docker 中运行 Redis 并限制其内存使用,核心是两步:一是通过 redis.conf 设置 maxmemory,二是用 Docker 的 --memory 参数做容器级内存硬限制。两者配合才能真正防住 OOM 和缓存雪崩。
一、为什么不能只靠 Docker 内存限制?
Redis 是单线程内存数据库,它自己管理内存分配。如果只设 --memory=512m 但没配 maxmemory,Redis 可能在内存快耗尽时仍尝试分配,触发 Linux OOM Killer 杀掉容器;反之,只设 maxmemory 400mb 却不限制容器内存,Redis 进程之外的开销(如 AOF 重写、RDB fork、客户端缓冲区)可能突破宿主机资源边界。
✅ 正确做法:双保险 —— 容器内存上限略高于 Redis 自身 maxmemory(例如 maxmemory=400mb → container memory=480mb)。
二、快速启动带内存限制的 Redis 容器
无需挂载配置文件也能生效,用命令行参数覆盖默认配置:
-
基础命令(推荐):
docker run -d --name my-redis \--memory=480m --memory-swap=480m \-p 6379:6379 \-e REDIS_ARGS="--maxmemory 400mb --maxmemory-policy allkeys-lru" \redis:7.2-alpine -
说明:
•--memory和--memory-swap相等 = 禁用 swap,避免延迟抖动
•REDIS_ARGS是官方镜像支持的环境变量,用于传入 redis-server 启动参数
•--maxmemory-policy必须设置,否则超限时直接返回错误(不是自动淘汰)
三、用自定义 redis.conf 实现精细控制
适合需要持久化、慢日志、密码等复杂配置的场景:
- 新建
redis.conf,关键几行:
maxmemory 400mb maxmemory-policy allkeys-lru maxmemory-samples 5 lazyfree-lazy-eviction yes # 内存紧张时异步删除,降低阻塞 save 900 1 requirepass mypass123
- 启动命令:
docker run -d --name my-redis \ --memory=480m --memory-swap=480m \ -p 6379:6379 \ -v $(pwd)/redis.conf:/usr/local/etc/redis/redis.conf \ redis:7.2-alpine redis-server /usr/local/etc/redis/redis.conf四、验证与监控是否生效
进容器检查实际配置和内存使用:
- 进入容器:
docker exec -it my-redis redis-cli -a mypass123 - 确认配置:
CONFIG GET maxmemory→ 应返回"419430400"(即 400mb) - 查看内存:
INFO memory→ 关注used_memory_human、maxmemory_human、mem_allocator - 模拟压测(可选):
redis-benchmark -n 100000 -q set key:__rand_int__ __rand_string__,观察是否触发淘汰
宿主机侧可用 docker stats my-redis 查看实时 RSS 内存占用,确保不接近 480MB 上限。

















