RDB持久化與AOF持久化可以同時存在,但重啓時,AOF文件會被優先用於恢復數據。
RDB持久化
RDB文件是壓縮過的二進制文件,用於保存和還原Redis服務器所有數據庫中的所有鍵值對數據。
SAVE命令由服務器進程直接執行,是阻塞的命令;BGSAVE由子進程(注意不是子線程)執行保存,不會阻塞服務器。
服務器狀態中會保存所有save選項設置的保存條件,當任意一個保存條件被滿足時,BGSAVE會被自動執行。
不同類型的鍵值對在RDB文件中以不同的形式保存。
AOF持久化
AOF文件保存所有修改過數據庫的寫命令記錄數據庫狀態,所有命令都以Redis命令請求協議的格式保存。
爲了避免頻繁IO,命令請求會先保存在AOF緩衝區裏,之後再定期寫入AOF文件。
由於AOF文件的模式,隨時間增加,AOF文件體積會逐漸增大,因此Redis提供了AOF重寫功能,實際上來說,該功能是通過讀取數據庫中的鍵值對反向獲得命令實現,其體積更小,狀態一致。
後臺重寫AOF文件過程:
在AOF文件重寫時,服務器會維護一個AOF重寫緩衝區,在子進程創建新的AOF文件期間,記錄服務器執行的所有寫命令,當子進程完成AOF文件的生成後,將重寫緩衝區內的所有內容追加到新的AOF文件末尾,此時服務器進程是阻塞的,不會產生新內容,待完成後,將新的AOF文件替換舊的文件,完成重寫操作。