Home > 系统管理, 零敲碎打 > [Redis] 解决Redis运行时Cannot save in background问题

[Redis] 解决Redis运行时Cannot save in background问题

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

Redis运行时经常出现 Cannot save in background. 问题,通常因为两个原因
1.Redis的占用的内存过大,导致BGSAVE时系统无法分配足够的内存给BGSAVE进程而导致错误。
碰到这种情况时,你可以这样操作,限制Redis的最大内存大小到系统内存的一半以内。
设置redis的内存可以在redis.conf 中修改 maxmemory 属性

1
   maxmemory  # 系统实际安装内存的一半以内,实验环境的话建议不要超过1/3

如果你机器的内存小但是硬盘速度够快(SSD级别)的话可以开启Redis的VM功能,
否则建议直接关闭VM功能,实验环境可以直接关闭VM

   vm-enable no #关闭VM
   

2.两次触发BGSAVE的时间间隔过短,导致BGSAVE操作队列阻塞而出现错误。
碰到这种情况时,一般根据你的程序情况调整一下Redis的BGSAVE的触发策略就可以了,
在redis.conf 中找到几条save开头的配置,根据要求进行相应的配置即可。
具体根据你的实际生产环境配置相应的策略。原则上以保证减少BGSAVE次数为目标

1
2
3
4
save 1000 1                 #1000秒内只要有1次更新就进行save (低频)
save 250 10                 #250秒内只要有10次更新就进行save(中频)
save 120 1000            #120秒内只要有1000次更新就进行save(高频)
save 40 10000            #40秒内只要有10000次更新就进行save(超高频,实验环境不需要配置)

第一个参数表示时间段,以秒为单位
第二个参数表示更新次数,以次为单位

最后,写入压缩属性可以设置到的打开状态,可以有效减少每次BGSAVE的硬盘写入时间

1
rdbcompression yes
  1. No comments yet.
  1. No trackbacks yet.