redis持久化那些事(kēng)兒


這是一篇包含了介紹性質和吐槽性質的日志。主要介紹一下我學習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:參考資料(排名不分先后):


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM