Redis學習筆記(八) RDB持久化

Redis是內存數據庫,它將本身的數據庫狀態存儲在內存裏面,因此若是不想辦法將存儲在內存中的數據庫狀態保存到磁盤,那麼服務器 進程一旦退出,服務器中的數據庫狀態也會消失不見。redis

爲了解決這個問題,Redis提供了RDB持久化功能,這個功能能夠將數據庫狀態保存到磁盤裏面算法

一、RDB文件的建立與載入數據庫

Redis可使用SAVE或BGSAVE命令建立RDB文件。數組

SAVE命令會阻塞服務器進程,直到RDB文件建立完畢,在服務器阻塞過程當中服務器不能處理任何命令,因此此時客戶端發送來的命令都會被拒絕。服務器

BGSAVE命令會派生一個子線程,而後由子線程負責建立RDB文件,服務器進程(主進程)繼續處理命令。app

RDB文件的載入是在服務器啓動時自動執行,因此Redis並無專門載入RDB文件的命令,只要Redis服務器在啓動時檢測到RDB文件存在,它就會自動載入。函數

因爲AOF文件的更新頻率一般比RDB文件更新頻率高,因此若是服務器開啓了AOF,那麼服務器優先從AOF文件還原數據庫,只有AOF關閉時,服務器纔會使用RDB文件還原數據庫。學習

BGSAVE命令執行時,Redis服務器處理SAVE、BGSAVE、BGREWRITEAOF命令方式會與平時不一樣。編碼

一、SAVE命令會被服務器拒絕,服務器禁止SAVE、BGSAVE命令同時執行,是爲了不主線程與子線程同時執行rdbSave產生競爭條件。spa

二、BGSAVE命令一樣也會被拒絕,由於兩個BGSAVE命令也會產生競爭條件。

三、BGREWRITEAOF命令會被延遲到BGSAVE命令執行完畢後執行,若是 BGREWRITEAOF命令正在執行,那麼客戶端發送的BGSAVE命令會被服務器拒絕。

RDB文件載入時,服務器會處在阻塞狀態,直到載入工做完成。

Redis使用BGSAVE命令自動間隔保存。

一、RDB文件的建立與載入
Redis可使用SAVE或BGSAVE命令建立RDB文件。
SAVE命令會阻塞服務器進程,直到RDB文件建立完畢,在服務器阻塞過程當中服務器不能處理任何命令,因此此時客戶端發送來的命令都會被拒絕。
BGSAVE命令會派生一個子線程,而後由子線程負責建立RDB文件,服務器進程(主進程)繼續處理命令。
RDB文件的載入實在服務器啓動時自動執行,因此Redis並無專門載入RDB文件的命令,只要Redis服務器在啓動時檢測到RDB文件存在,它就會自動載入。
因爲AOF文件的跟新頻率一般比RDB文件更新頻率高,因此若是服務器開啓了AOF,那麼服務器優先從AOF文件還原數據庫,只有AOF關閉時,服務器纔會使用RDB文件還原數據庫。
BGSAVE命令執行時,Redis服務器處理SAVE、BGSAVE、BGREWRITEAOF命令方式會與平時不一樣。
一、SAVE命令會被服務器拒絕,服務器禁止SAVE、BGSAVE命令同時執行,是爲了不主線程與子線程同時執行rdbSave產生競爭條件。
二、BGSAVE命令一樣也會被拒絕,由於兩個BGSAVE命令也會產生競爭條件。
三、BGREWRITEAOF命令會被延遲到BGSAVE命令執行完畢後執行,若是 BGREWRITEAOF命令正在執行,那麼客戶端發送的BGSAVE命令會被服務器拒絕。
RDB文件載入時,服務器會處在阻塞狀態,直到載入工做完成。
Redis使用BGSAVE命令自動間隔保存。

struct redisServer{
//記錄了保存條件的數組
struct saveparam *saveparams;
//修改計數器
long long diry;
//上一次執行保存的時間
time_t lastsave;
}
save選項的保存條件:
struct saveparam{
//秒數
time_t seconds;
//修改次數
int changes;
}

Redis的服務器週期性操做函數serverCron默認100毫秒執行一次,用於維護正在運行的服務器,他的一項工做就是檢查save選項所設置的保存條件是否已經知足,若是知足則執行BGSAVE命令。

 

 

 

RDB文件結構

 

 

 

 RDB文件中的數據庫結構示例

 

Redis 標識時Redis數據庫RDB文件
db_version 文件版本
selectdb 標識後面是查詢的第幾個數據庫。
pairt 保存着該數據庫的全部鍵值對以及過時時間
EOF 標識內容結束
check_sum 校驗和,用來檢測RDB文件是否正確有無損壞。


VALUE編碼:
一、字符串對象
redis支持壓縮存儲,若是不壓縮的狀況下,存儲len與字符串;若是壓縮則結構以下:

 

 

 REDIS_RDB_ENC_LZF常量標誌着字符串被LZF算法壓縮,讀入陳旭在碰到這個常量時會根據compressed_len(壓縮後長度),orgin_len(原長度)和compressed_string (壓縮後字符串)三個部分,對字符串進行解壓縮。

二、列表對象

 

 

 list_length記錄了列表長度。tiem每一項都是一個字符串,程序讀入時按字符串對象讀入。

三、集合對象 存儲方式與列表對象類似。

四、哈希表對象

 

 

 其中key_value_pair結構中的鍵值對以鍵緊挨值的方式排列。

五、有序結合對象

 

 

 

 

 

 


 

天天學一點,總會有收穫。

 

說明:尊重做者知識產權,文中內容參考《Redis設計與實現》,僅在此作學習與你們分享。

 

 

 

 

 

 




相關文章
相關標籤/搜索