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,再嘗試手動及自動快照——終!於!成!功!了!就這樣,本來是默認的持久化,讓我活生生的搞了大半天。
就醬吧。。。我想靜靜的一個人吹吹空調,思考一下人生。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章