Redis-持久化之RDB
上一篇中,我們說了Redis持久化的一些相關理論知識。今天,我們詳細學習一下RDB持久化機制的實戰。
一、如何配置RDB持久化機制
配置RDB持久化很簡單,就是在redis.conf檔案中配置save命令列。如下:
預設情況下,redis給出如上的配置。以save 60 10000舉例說明,它表示:每隔60s,如果有超過10000個key發生了變更,那麼就生成一個新的dump.rdb檔案,就是當前redis記憶體中完整的資料快照,這個操作也被稱之為snapshotting,快照。
當然我們也可以手動呼叫save或者bgsave命令分別同步或者一步執行rdb快照生成。
可以看到,save可以設定多個,就是多個snapshotting檢查點,每到一個檢查點,就會去check一下,是否有指定的key數量發生了變更,如果有就生成一個新的dump.rdb檔案。
二、RDB持久化機制的工作流程
(1)redis根據配置自己嘗試去生成rdb快照檔案。
(2)fork一個子程序出來。
(3)子程序嘗試將資料dump到臨時的rdb快照檔案中。
(4)完成rdb快照檔案的生成之後,就替換之前的舊的快照檔案。
三、實戰
1、在redis中儲存幾條資料,立即停掉redis程序,然後重啟redis,看看剛才插入的資料還在不在。
(1)首先我們進入/var/redis/6379目錄,可以看到該目錄下還沒有rdb檔案。
(2)進入redis cli互動命令列,並設定一個鍵值對,然後立即停掉redis程序。
(3)重啟redis服務,看看剛剛的鍵值對是否被持久化。
可以看到k1的值還在,為什麼?理論上來說,我們在設定了k1的值後是立即停掉redis程序的,還沒到 snapshotting檢查點,但是我們可以看到在/var/redis/6379目錄下,確實生成了一個dump.rdb檔案。
其實,在這裡,我們通過redis-cli SHUTDOWN方式去停掉redis程序,這是一種安全退出的模式,redis在退出的時候會將記憶體中的資料立即生成一份完整的rdb快照。請看第2點的演示。
2、在redis中再儲存幾條新的資料,立即用kill -9粗暴殺死redis程序,模擬redis故障異常退出,導致記憶體資料丟失的場景。
(1)現在dump.rdb中有一個k1的值,我們現在增加一個k2的值,然後通過kill -9命令直接殺死程序。
(2)重啟redis服務, 看看剛剛的k2是否被持久化。可以看到k2的值沒有被持久化,由於k1已經在dump.rdb中被持久化,所以k1的值仍然在。
3、手動設定一個save檢查點,然後通過kill -9粗暴殺死redis程序,模擬redis故障異常退出。
(1)我們設定一個檢查點,每5s有一個值發生變更,就生成一個新的dump.rdb檔案。
(2)刪除已經存在dump.rdb檔案,並重啟redis。
(3)設定k1的值,然後過5s後,通過kill -9殺死程序。
(4)重啟redis服務, 看看剛剛的k1是否被持久化。可以看到k1的值在5s後被持久化,即使通過kill -9暴力停止redis服務,仍然被寫入dump.rdb中。