Redis 数据持久化之 RDB
我們知道 Redis 是內存數據庫,它將自己的數據存儲在內存中,如果它不想辦法將數據存入磁盤中,那么當服務器進程退出或意外宕掉的時候,服務器中的數據也會消失。
為了解決這個問題, Redis 提供了 RDB 與 AOF 兩種數據持久化方式,將數據存儲到磁盤中,避免數據丟失。
AOF 持久化不在本篇文章討論范圍內,如果大家感興趣可以關注后面的總結文章。
一、RDB 介紹
RDB(Redis DataBase)持久化既可以手動執行,也可以通過觸發服務器配置信息自動執行,用來將某個時間點上的數據保存到磁盤上的一個 RDB(dump.rdb) 文件中。
因為 dump.rdb 文件是保存在磁盤上的,即使 Redis 服務器進程退出或者意外宕掉,也可以通過該文件進行數據還原。
有兩個命令可以用于生成 RDB 文件,一個是 SAVE 一個是 BGSAVE,但是這兩個命令不可以同時被服務器處理。這兩個命令的不同點主要是:
- SAVE 命令會阻塞服務器進程,直到 RDB 文件創建完畢為止,在服務器進行阻塞期間,服務器不能處理任何命令請求。
- BGSAVE 命令會派生出一個子進程,然后由子進程負責創建 RDB 文件,在這種情況下,服務器進程可以繼續處理后續的命令請求。
想要生成 RDB 文件需要一定的條件,但是載入 RDB 文件只需要啟動服務器即可,只要 Redis 服務器在啟動時監測到 RDB 文件的存在,就會自動載入 RDB 文件。當服務器載入 RDB 文件期間,會一直處于阻塞狀態,直到載入工作完成為止。
PS:
因為 AOF 文件的更新頻率高于 RDB 文件,所以當兩種持久化模式都開啟時,服務器會優先使用 AOF 文件來還原數據庫。
二、自動間隔性同步數據
因為 BGSAVE 命令可以在不阻塞服務器進程的情況下執行,所以 Redis 允許用戶通過自定義服務器配置信息,讓服務器每隔一段時間就自動執行一次 BGSAVE 命令。
用戶可以使用 save time count 設置多個條件,只要其中一個條件被滿足,服務器就會自動執行 BGSAVE 命令,具體的觸發條件可以在 redis.conf 中進行配置。
默認的配置信息如下:
save 900 1 # 在 900s 之內至少對數據庫進行了 1 次修改 save 300 10 # 在 3000s 之內對數據庫至少進行了 1 次修改 save 60 10000 # 在 60s 之內至少對數據庫進行了 10000 次修改Redis 底層會使用 saveParam 結構保存時間與修改次數:
struct saveparam {// 秒數time_t seconds;// 修改次數int changes; };最終會使用一個 saveparam 數組來保存相關的配置信息,下面是一個具體的圖
redisServer 對象除了維護著一個 saveparam 數組外,還維護著一個 dirty 計數器與 lastsave 屬性。
- 每當服務器修改命令之后,程序就會自動對 dirty 屬性執行更新,執行了多少次修改,dirty 就對應增加多少。
- lastsave 屬性記錄了服務器上次執行保存(SAVE 或 BGSAVE)操作的時間。
在服務器執行周期函數時(serverCron(),默認 100ms 執行一次),會根據 saveparam、dirty 與 lastsave 屬性,自動判斷出執行保存的時機。
三、RDB 持久化過程演示
下面簡單的還原一下 RDB 文件數據恢復的過程,推薦大家自己嘗試一下。
1.修改 redis.conf 配置文件中的 save 屬性,設置在 10s 內修改了數據庫就執行 BGSAVE 命令(保證在短時間內獲得 RDB 文件)。
save 10 1 # 在 10s 之內至少對數據庫進行了 1 次修改 save 300 10 save 60 100002.為了保證測試的正確性,可以在 Redis 客戶端執行一次 FLUSHDB 命令,清空當前數據庫中的所有數據,退出客戶端并刪除 dump.rdb 文件(其實執行 FLUSHDB 命令后 dump.rdb 中已經沒有有效數據了)。
3.連接 Redis 客戶端,添加一條數據,大約 10s 鐘左右退出 Redis 客戶端。
127.0.0.1:6379> KEYS * (empty list or set) 127.0.0.1:6379> SET key1 value1 OK4.查看當前文件下的所有文件,發現多了一個 dump.rdb 文件,然后使用 mv 命令修改 dump.rdb 文件名為 dump1.rdb。再次連接 Redis 客戶端,執行一次 FLUSHDB 命令,確保當前數據庫中沒有任何數據。
5.由于 FLUSHDB 命令也會產生 dump.rdb 文件,因此要刪除該 dump.rdb 文件,修改 dump1.rdb 文件名為dump.rdb,用來還原數據,接著關閉 Redis 服務。
6.重啟 Redis 服務,因為 Redis 服務在啟動時會加載 dump.rdb 文件,因此在使用客戶端連接到數據庫時,dump.rdb 文件中的數據會被還原。
127.0.0.1:6379> keys * 1) "key1"四、參考資料
《Redis 設計與實現》 黃建宏 著
總結
以上是生活随笔為你收集整理的Redis 数据持久化之 RDB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女兵几年可以安排工作?
- 下一篇: Redis 数据结构之哈希表