宝塔面板后台redis莫名停止运作,导致站点打开出现错误,当我重启redis后,系统负载又飙升,解决办法如下
即时配置调整
# 设置内存上限
redis-cli config set maxmemory 1g
# 设置内存淘汰策略
redis-cli config set maxmemory-policy volatile-lru
# 适度提高采样精度
redis-cli config set maxmemory-samples 10
# 永久保存配置
redis-cli config rewrite
或者使用allkeys-lru
内存淘汰策略
redis-cli config set maxmemory-policy allkeys-lru
开启 active-defrag
机制
redis-cli CONFIG SET activedefrag yes
确认是否已开启:
redis-cli CONFIG GET activedefrag
找出 Redis 中“最大的键”
redis-cli --bigkeys
批量删除这些大 key(谨慎操作):
redis-cli --scan --pattern "xxxxx.com*" | xargs redis-cli del
脚本删除大 key
curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clean_bigkeys.sh && chmod +x clean_bigkeys.sh
🧪 用法说明:
- 查看前 10 个最大 key(仅分析,不删除):
./clean_bigkeys.sh --top-n 10
- 清除所有大于 512KB 的 key(并 dry-run 看看):
./clean_bigkeys.sh --dry-run --threshold 524288
- 真正删除大于 500KB 的 key:
./clean_bigkeys.sh --threshold 500000
- 把大于 500KB 的 key 设置为 1 小时(3600 秒)后自动过期
./clean_bigkeys.sh --threshold 500000 --expire 3600
内存上限配置说明
推荐将Redis内存上限设置为系统总内存的40-45%。例如:
系统内存 | 推荐Redis内存上限 |
---|---|
2GB | 1g |
4GB | 1.6g |
8GB | 3.2g |
内存分配原理
保留足够内存给系统其他组件是必要的,主要考虑:
- PHP-FPM进程需要足够内存处理并发请求
- MySQL数据库(尤其是InnoDB缓冲池)需要稳定内存
- 操作系统文件缓存需求
- 预防系统内存不足导致的交换(swap)和OOM Killer触发
内存淘汰策略选择
volatile-lru
策略适用于大多数Web应用场景:
- 只淘汰设置了过期时间(TTL)的键
- 优先淘汰最近最少使用(Least Recently Used)的键
- 保护未设置TTL的重要数据
采样精度说明
# 提高内存淘汰精度
redis-cli config set maxmemory-samples 10
maxmemory-samples
参数控制Redis执行淘汰策略时的采样数量:
- 默认值:Redis 5.0以前为3,5.0及以后为5
- 增加至10可提高淘汰精度,但会略微增加CPU开销
- 适合对缓存命中率要求较高的场景
监控命令
查看内存使用情况
redis-cli info memory
确认内存上限配置
redis-cli config get maxmemory
查看内存淘汰策略
redis-cli config get maxmemory-policy
查看采样设置
redis-cli config get maxmemory-samples
检查缓存命中率
redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"
例如:
keyspace_hits:135433 (缓存命中次数)
keyspace_misses:60863 (缓存未命中次数)
缓存命中率计算
命中率 = 命中次数 / (命中次数 + 未命中次数)
= 135433 / (135433 + 60863) = 135433 / 196296 ≈ 0.69 或 69%