前言
在redis中添加list,字符串类型的键值对之后,redisDeskManager上提示了一些错误信息:
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
翻译为中文大概意思是:Redis被配置为保存数据库快照,但它目前不能持久化到磁盘。用来修改集合数据的命令不能用。请查看Redis日志的详细日志信息。
原因
强制关闭Redis快照导致不能持久化。
解决方法
1、将 stop-writes-on-bgsave-error 值设置为no即可避免这种问题。如果redis缓存的是非重要数据,对可用性要求不高,可以采用这种方式。有两种修改方式:
- 命令行修改方式
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
- 修改redis.conf配置文件,更改后需要重启redis
vim 打开redis.conf文件,使用快捷键匹配模式 /stop-writes-on-bgsave-error 定位到stop-writes-on-bgsave-error 字符串所在位置,将原先设置的yes设置为no。然后重启 redis-cli -h 127.0.0.1 -p 6379 shutdown
2、配置优化,添加以下配置项到 /etc/sysctl.conf 配置文件
vm.overcommit_memory=1
执行以下命令使其实时生效:
sysctl vm.overcommit_memory=1
Linux内核会根据参数 vm.overcommit_memory参数的设置决定是否放行。
- vm.overcommit_memory=1 :直接放行
- vm.overcommit_memory=0 :则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。
- vm.overcommit_memory=2 :则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap,决定是否放行。
vm.overcommit_memory 这个参数又是干什么的呢?
Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存,将这些不会使用的空闲内存分配给其它程序使用,以提高内存利用率,这种技术叫做Overcommit。一般情况下,当所有程序都不会用到自己申请的所有内存时,系统不会出问题,但是如果程序随着运行,需要的内存越来越大,在自己申请的大小范围内,不断占用更多内存,直到超出物理内存,当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程,哪些占用内存越多,运行时间越短的进程越有可能被杀掉),以便释放内存。
3、如果缓存数据丢失也可以接受,可以关闭appendonly
appendonly on