與RDB持久化通過保存數據庫中的鍵值對來記錄數據庫狀態不同,AOF持久化是通過保存Redis服務器所執行的寫命令來記錄數據庫狀態的。
一、AOF持久化的實現
AOF持久化功能的實現可以分爲命令追加(append)、文件寫入、文件同步(sync)三個步驟。
1、命令追加
當AOF持久化功能處於打開狀態時,服務器在執行完一個寫命令之後,會以協議格式將被執行的寫命令追加到服務器狀態的aof_buf緩衝區的末尾:
2、AOF文件的寫入與同步
因爲服務器在處理文件事件時可能會執行寫命令,使得一些內容被追加到aof_buf緩衝區裏面,所以在服務器每次結束一個事件循環之前,它都會調用flushAppendOnlyFile函數,考慮是否需要將aof_buf緩衝區中的內容寫人和保存到AOF文件裏面。
flushAppendOnlyFile函數的行爲由服務器配置的appendfsync選項的值來決定。
3、AOF文件的載入與數據還原
載入過程
服務器讀人AOF文件,並根據文件內容來還原數據庫狀態
二、AOF重寫
1、AOF文件重寫的實現
首先從數據庫中讀取鍵現在的值,然後用一條命令去記錄鍵值對,代替之前記錄這個鍵值對的多條命令,這就是AOF重寫功能的實現原理。
2、AOF後臺重寫
爲了解決這種數據不一致問題,Redis服務器設置了一個AOF重寫緩衝區,這個緩衝區在服務器創建子進程之後開始使用,當Redis服務器執行完一個寫命令之後,它會同時將這個寫命令發送給AOF緩衝區和AOF重寫緩衝區。
當子進程完成AOF重寫工作之後,它會向父進程發送一個信號,父進程在接到該信號之後,會調用一個信號處理函數,並執行以下工作:
1)將AOF重寫緩衝區中的所有內容寫人到新AOF文件中,這時新AOF文件所保存的數據庫狀態將和服務器當前的數據庫狀態一致。
2)對新的AOF文件進行改名,原子地(atomic )覆蓋現有的AOF文件,完成新舊兩個AOF文件的替換。