这是一篇包含了介绍性质和吐槽性质的日志。主要介绍一下我学习redis持久化时候被坑的经历。redis的使用介绍现在没有打算写,因为比较多,以我如此懒的性格。。。好吧,还是有点这方面想法的,不过一篇博客肯定是写不下,要写的话以后慢慢写出一个系列来。今天先说序列化。
首先,我们都知道redis是个内存数据库,也就是所有数据都放在内存中的。那么如果进程挂掉了,或者系统重启的时候,内存就会清理掉了。为了保住这些数据,redis做了持久化的功能,也就是把数据库中的数据写入磁盘中保存起来。如果不幸服务器挂掉了,再次启动redis-server的时候,会从磁盘中自动恢复这些数据。
关于redis持久化的方法,RDB和AOF两种方式,百度一抓一大把,我就不啰嗦了。下面留的参考文章里面有介绍。redis中默认使用的是RDB方式。某篇文章说,官方推荐RDB方式足够了,除非对数据实时性要求特别高的。我想了想我们对数据实时性要求应该不太高,而且也不太会频繁发生变化,所以就采用RDB方式了。
我在数据库中存了几个数,然后kill掉了redis-server的进程,再启动,诶?说好的自动恢复呢?数据库里明明啥都没有啊!检查配置文件 /etc/redis/redis.conf中:
save 900 1 save 300 10 save 60 10000
都是默认的,没错啊!特意看了看这几个参数的解释:
# after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed
大概是说,如果900秒之内有至少1个key发生变化,就保存快照;或者,300秒之内有至少10个key发生变化,就保存快照;再或者,60秒内有至少10000个key发生变化,就保存快照。各save之间是or的关系,满足一条即开始执行。
然而我的数据并没有保存到磁盘上。百度一下,info看看,发现一行
rdb_last_bgsave_status:err
呃,在redis-cli中执行
config set stop-writes-on-bgsave-error no
通过关闭配置项stop-writes-on-bgsave-error,解决快照出错的问题。然后执行save手动持久化,还是不行。what gui?
后来在询问别人的之后,大神说,基本上只会是内存和磁盘的问题,没有写权限。权限?难道说。。。
我把redis-server关掉,然后以sudo方式启动,就ok了。
这时候再用info查,rdb_last_bgsave_status的位置已经变成了ok。我用程序往数据库里写了200多条数据,查看一下日志(位于/var/log/redis/redis-server.log)
25763:M 27 Jul 17:35:43.688 * 1 changes in 900 seconds. Saving...
25763:M 27 Jul 17:35:43.690 * Background saving started by pid 27377
27377:C 27 Jul 17:35:43.694 * DB saved on disk
27377:C 27 Jul 17:35:43.695 * RDB: 4 MB of memory used by copy-on-write
呕液,保存快照成功~
再次kill掉redis-server进程,然后sudo redis-server &启动,用keys *查看。诶???说好的自动恢复呢???还是没有啊!
于是又查,查到原来是在启动时候需要带上配置文件。再启动:
sudo redis-server /etc/redis/redis.conf &
然而特喵的redis告诉我,vm-enabled这个参数它不认识。纳尼?你们家自己的参数你自己不认识?
上网查了查,最后查到官网(http://www.redis.io/topics/virtual-memory ),上面说:
IMPORTANT NOTE: Redis VM is now deprecated. Redis 2.4 will be the latest Redis version featuring Virtual Memory (but it also warns you that Virtual Memory usage is discouraged). We found that using VM has several disadvantages and problems. In the future of Redis we want to simply provide the best in-memory database (but persistent on disk as usual) ever, without considering at least for now the support for databases bigger than RAM. Our future efforts are focused into providing scripting, cluster, and better persistence.
大概意思是说,vm这个东西我们现在已经废弃掉了,最后一个能使用的版本是2.4,以后都没了。我们觉得这个东西太low,一点都不符合我们高大上的定位,又不好用。
好吧,我假装懂了。我把vm相关的几个参数都注释掉再试,结果还是不行。在官网上又乱翻,结果无意中发现了一个页面(http://www.redis.io/topics/config ),上面写了不同版本的配置文件。页面是酱婶的:
于是我就震撼了,redis官方这是有多懒啊!更新了版本,不更新config文件,我redis3.0.7的版本,里面居然还是2.4以前的配置文件?!
点进3.0,把里面的配置文件内容拷下来,粘贴进我的配置文件里,然后修改一下守护进程、日志、RDB持久化这几个地方,再启动一下redis-server,再尝试手动及自动快照——终!于!成!功!了!就这样,本来是默认的持久化,让我活生生的搞了大半天。
就酱吧。。。我想静静的一个人吹吹空调,思考一下人生。。。
PS:参考资料(排名不分先后):