Redis不支持内存阈值自动触发bgsave,需外部监控:定时采集used_memory_rss或used_memory_percent,超阈值则执行redis-cli bgsave;须避坑碎片误判、超时卡死、并发冲突、单位未清洗、锁竞争及静态阈值滞后等问题。
Redis内存使用率超过阈值时自动触发bgsave
Redis本身不支持根据内存使用量自动调整RDB频率,
必须由外部监控驱动。核心思路是:定时采集
或
,与预设阈值比较,超限则执行
。注意别用
(含碎片),它可能远低于RSS,导致误判。
用
redis
-cli --stat解析实时内存指标
输出是滚动文本流,不适合直接解析;更可靠的是用
并提取关键字段:
常见陷阱:
未设置
参数,脚本在Redis不可达时卡住——加
限制连接超时
忽略
场景:即使
不高,高碎片也可能触发OOM,建议一并监控
用
提取时没处理单位(如"1048576000b"),应先用
清洗
Shell脚本中避免重复bgsave和并发冲突
连续多次调用
会被Redis排队,但脚本若每秒检查一次,极易造成堆积。正确做法:
Redis 8.2.3
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
下载
记录上一次
时间戳到临时文件(如
),两次触发间隔至少设为60秒
执行前先查
,值为
则跳过
用
防止多实例同时写同一状态文件,或改用
生成唯一锁文件
示例判断逻辑:
内存阈值设定要考虑业务写入节奏
静态阈值(如80%)在写入突增时可能来不及响应,动态阈值更稳妥:
取最近5分钟
的移动平均,再乘以1.2作为当前阈值
对写密集型实例,把
设为物理内存的70%,留30%给系统和fork开销
如果启用了
,
失败概率下降,但
持续>2.0仍需告警——说明内存碎片已影响效率
真正难处理的是“内存缓慢爬升+小幅度抖动”的场景,这时候光看瞬时百分比没用,得结合
和增长斜率做趋势预测,那已经超出简单脚本范畴了。
bgsaveused_memory_rssused_memory_percentredis-cli bgsaveused_memoryredis-cli --statINFO memoryredis-cli INFO memory | grep -E "used_memory_rss|used_memory_peak|mem_fragmentation_ratio"timeout-t 2mem_fragmentation_ratio > 1.5used_memory_percentawk '/used_memory_rss/{print $2}'sed 's/[^0-9]//g'bgsavebgsave/tmp/last_bgsave.tsredis-cli INFO persistence | grep rdb_bgsave_in_progress1set -o noclobbermktempif [[ $(redis-cli INFO persistence | awk -F': ' '/rdb_bgsave_in_progress/{print $2}') == "1" ]]; then
echo "bgsave already running"
exit 0
fiused_memory_rssmaxmemoryvm.overcommit_memory=1bgsavemem_fragmentation_ratioused_memory_peak