2018-1-17 by Atlasredis
將redis在內存中的數據庫狀態保持到磁盤裏面,避免數據意外丟失。數據庫
- 既能夠手動執行,也能夠根據服務器配置選項按期執行。
- 生成的RDB文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成RDB文件時的數據庫狀態。
- RDB文件載入時,服務器一直處於阻塞狀態,直到完成。
命令SAVE、BGSAVE
SAVE命令會阻塞redis服務器進程,直到RDB文件建立完畢爲止,在服務器進程阻塞期間,服務器不能處理任何命令請求。
BGSAVE命令會派生出一個子進程,而後由子進程負責建立RDB文件,服務器進程(父進程)繼續處理命令請求。數組- AOF文件更新頻率一般比RDB文件更新頻率高。
so -->
若是開啓AOF,服務器優先使用AOF文件還原數據庫;
只有AOF關閉,服務器纔會使用RDB文件還原數據庫。
BGSAVE命令執行時的服務器狀態:
(1)BGSAVE執行期間,客戶端發送的SAVE命令會被服務器拒絕。
(2)BGSAVE執行期間,客戶端發送的BGSAVE命令會被服務器拒絕。
(3)BGSAVE和BGREWRITEAOF不能同時執行:
若是BGSAVE正在執行,那麼客戶端發送的BGREWRITEAOF會被延遲到BGSAVE後執行;
若是BGREWRITEAOF正在執行,那麼客戶端發送的BGSAVE會被服務器拒絕。緩存- SAVE保存條件
save 900 1 服務器在900秒以內,對數據庫進行了至少1次修改 save 300 10 服務器在300秒以內,對數據庫進行了至少10次修改 save 60 10000 服務器在60秒以內,對數據庫進行了至少10000次修改
struct redisServer { // ... // 記錄保存條件的數組 struct saveparam *saveparams; // 修改計數器 long long dirty; // 上次執行保存的時間 time_t lastsave; // ... } struct saveparam { // 秒數 time_t seconds; // 修改數 int changes; }
ServerCron 函數檢查保存條件的過程安全
RDB文件結構將和JAVA CLASS文件一同討論。服務器
- AOF持久化是經過保存redis服務器所執行的 寫命令 來記錄數據庫狀態的。
AOF文件內容是純文本格式。
e.g.
redis> SET msg "hello"
ok
AOF文件內容(SELECT命令是服務器自動添加的):
2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n
3\r\n$3\r\n$3\r\nSET\r\n$3\r\nmsg\r\n$5\r\nhello\r\napp- AOF持久化實現步驟:
命令追加 --> 文件寫入 --> 文件同步- 命令追加是將執行的寫命令追加到服務器狀態的aof_buf緩存區的末尾:
struct redisServer { // ... // AOF緩衝區 sds aof_buf; // ... }
- 文件的寫入與同步
flushAppendOnlyFile()函數考慮是否要將aof_buf中的內容寫入和保存到AOF文件裏面,行爲由服務器配置的appendfsync選項的值來決定。- appendfsync配置:
always:AOF持久化效率最慢,安全性來講最安全,故障只會丟失一個命令數據。
everysec:AOF持久化效率足夠快,安全性來講,故障只會丟失一秒鐘的命令數據。
no:AOF持久化效率最快,安全性來講,故障會丟失上次同步AOF文件以後的全部寫命令數據。ide
- AOF 文件載入過程
- AOF文件重寫,解決AOF文件體積膨脹問題。
- AOF文件重寫原理:
AOF文件重寫並不須要對現有的AOF文件進行讀取、分析或者寫入操做,而是經過讀服務器當前的數據庫狀態來實現的。
AOF文件重寫首先從數據庫中讀取鍵如今的值,而後用一條命令記錄鍵值對,代替以前記錄這個鍵的多條命令。
若是元素數量超過redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量的值,那麼重寫多條命令記錄鍵的值。- AOF文件後臺重寫過程(BGREWRITEAOF原理)
參考文獻:《redis設計與實現》函數