Redis 内存管理在 Debian 上的设置指南
一 配置文件与路径
- 配置文件位置:Debian/Ubuntu 上通常为 /etc/redis/redis.conf。
- 编辑与重启:
- 编辑:sudo nano /etc/redis/redis.conf(或 vim)。
- 重启:sudo systemctl restart redis-server。
- 运行时查看与修改(无需重启):
- 查看:redis-cli CONFIG GET maxmemory
- 修改:redis-cli CONFIG SET maxmemory 2gb
- 持久化到配置文件:修改后执行一次重启,或在确认无误后用 CONFIG REWRITE 将运行时配置写回磁盘。
二 核心内存参数与推荐值
- 设置内存上限(maxmemory)
- 作用:限制 Redis 可使用的最大内存,防止耗尽系统资源。
- 建议:设为物理内存的 70%~80%(为系统与其他进程预留空间);集群模式下每个分片单独设置。
- 示例:maxmemory 2gb。
- 设置淘汰策略(maxmemory-policy)
- 作用:达到上限时如何自动淘汰键以释放空间。
- 常用策略与适用场景:
- allkeys-lru:所有键按 LRU 淘汰(通用缓存首选)
- allkeys-lfu:所有键按 LFU 淘汰(热点更稳)
- volatile-lru / volatile-lfu / volatile-ttl:仅对设置了 TTL 的键淘汰(键有过期时间时)
- allkeys-random / volatile-random:随机淘汰
- noeviction:禁止写入并返回 OOM(默认,生产环境通常不建议)
- 示例:maxmemory-policy allkeys-lru。
- 提升淘汰精度(maxmemory-samples)
- 作用:LRU/LFU 为近似算法,采样越多越精确(代价是 CPU)。
- 示例:maxmemory-samples 5。
三 碎片整理与分配器优化
- 启用碎片整理(activedefrag)
- 作用:后台合并空闲内存块,降低 memfragmentationratio,减少碎片占用。
- 示例:
- activedefrag yes
- active-defrag-threshold-lower 10
- active-defrag-threshold-upper 25
- active-defrag-cycle-min 5
- active-defrag-cycle-max 25
- jemalloc 后台回收(Redis 6.0+)
- 作用:由 jemalloc 后台线程回收未使用内存,降低常驻占用。
- 示例:jemalloc-bg-thread yes。
- 碎片与 swap 监控要点
- 使用 INFO memory 观察:
- memfragmentationratio > 1 表示存在碎片;过大需关注。
- memfragmentationratio < 1 可能已发生 swap,性能会显著下降。
四 运行时调整与验证步骤
- 步骤
- 备份配置:sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak-$(date +%F)。
- 编辑配置:设置 maxmemory 与 maxmemory-policy(如:maxmemory 2gb;maxmemory-policy allkeys-lru)。
- 热更新(不重启):
- redis-cli CONFIG SET maxmemory 2gb
- redis-cli CONFIG SET maxmemory-policy allkeys-lru
- 持久化:确认无误后执行 redis-cli CONFIG REWRITE,或 sudo systemctl restart redis-server。
- 验证:
- 配置值:redis-cli CONFIG GET maxmemory maxmemory-policy
- 使用情况:redis-cli INFO memory(关注 used_memory / maxmemory / memfragmentationratio)。
五 生产实践与注意事项
- 合理上限:单实例建议不超过物理内存的 70%~80%;为系统、监控、复制缓冲区等预留空间。
- 淘汰策略选择:缓存为主选 allkeys-lru/allkeys-lfu;键普遍设置 TTL 可选 volatile-ttl;严禁在写入关键业务中使用 noeviction。
- 碎片治理:开启 activedefrag,结合 INFO memory 观察 memfragmentationratio,避免长期高碎片。
- 避免 swap:尽量保证足够内存并禁用或降低 swap 倾向;出现 swap 会严重拖慢 Redis。
- 集群分片:每个分片的 maxmemory 需按数据量与分片策略单独规划。
- 变更流程:先小流量验证,再滚动发布;变更后用 CONFIG REWRITE 固化或通过 systemctl 重启确保一致性。