標籤:proc 一個 不能 重寫原理 ext images write 添加 file
2018-1-17 by Atlas
將redis在記憶體中的資料庫狀態保持到磁碟裡面,避免資料意外丟失。
- 既可以手動執行,也可以根據伺服器配置選項定期執行。
- 產生的RDB檔案是一個經過壓縮的二進位檔案,通過該檔案可以還原產生RDB檔案時的資料庫狀態。
- RDB檔案載入時,伺服器一直處於阻塞狀態,直到完成。
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伺服器所執行的 寫命令 來記錄資料庫狀態的。
struct redisServer { // ... // AOF緩衝區 sds aof_buf; // ...}
- 檔案的寫入與同步
flushAppendOnlyFile()函數考慮是否要將aof_buf中的內容寫入和儲存到AOF檔案裡面,行為由伺服器配置的appendfsync選項的值來決定。
- appendfsync配置:
always:AOF持久化效率最慢,安全性來說最安全,故障只會丟失一個命令資料。
everysec:AOF持久化效率足夠快,安全性來說,故障只會丟失一秒鐘的命令資料。
no:AOF持久化效率最快,安全性來說,故障會丟失上次同步AOF檔案之後的所有寫命令資料。
- AOF檔案重寫,解決AOF檔案體積膨脹問題。
- AOF檔案重寫原理:
AOF檔案重寫並不需要對現有的AOF檔案進行讀取、分析或者寫入操作,而是通過讀伺服器當前的資料庫狀態來實現的。
AOF檔案重寫首先從資料庫中讀取鍵現在的值,然後用一條命令記錄索引值對,代替之前記錄這個鍵的多條命令。
如果元素數量超過redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量的值,那麼重寫多條命令記錄鍵的值。
- AOF檔案後台重寫過程(BGREWRITEAOF原理)
參考文獻:《redis設計與實現》
redis筆記-資料庫之持久化策略