1. 程式人生 > >redis持久化那些事(kēng)

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這個引數它不認識。納尼?你們家自己的引數你自己不認識?
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,再嘗試手動及自動快照——終!於!成!功!了!就這樣,本來是預設的持久化,讓我活生生的搞了大半天。就醬吧。。。我想靜靜的一個人吹吹空調,思考一下人生。。。