除了RDB持久化功能以外,Redis還提供了AOF持久化功能。與RDB持久化經過保存數據庫中的鍵值對來記錄數據庫狀態不一樣,AOF持久化是經過保存Redis服務器所執行的寫命令來記錄數據庫狀態的。redis
服務器在啓動時,能夠經過載入和執行AOF文件中保存的命令來還原服務器關閉前的數據庫狀態。數據庫
AOF持久化功能的實現能夠分爲命令追加append、文件寫入、文件同步sync三個步驟。安全
一、服務器在執行完一個寫命令後,會議協議格式將被執行的寫命令追加到服務器狀態的aof_buf緩衝區末尾。服務器
二、Redis的服務器進程是一個時間循環,這個循環中的文件事件負責接收客戶端的命令請求,以及回覆,而時間事件則負責執行定時運行的函數,因此服務器每次結束一個事件循環以前他都會調用flushAppendOnlyFile函數,考慮(appendfsync配置)是否將aof_buf緩衝區的內容寫入和保存到AOF文件中。網絡
appendfsync值:always(每一個事件循環都要同步將aof_buf中的內容寫入AOF文件)、everysec (每秒)、no(每一個事件循環都要寫,可是時寫入系統緩衝區)app
AOF數據還原:函數
一、建立一個不帶網絡的僞客戶端(redis只能在客戶端中執行)學習
二、從APF文件中分析並讀出一條寫命令三、使用僞客戶端執行被讀出的寫命令四、重複二、3步驟 直到所有處理完成。設計
AOF重寫blog
爲解決AOF文件膨脹問題,Redis建立一個新的AOF文件,兩個APF文件保存的數據庫狀態同樣,可是新的AOF文件去掉了冗餘的命令。
AOF重寫不須要讀取舊的AOF文件,而是直接讀取數據庫中的鍵值,合併屢次寫入一個key,保存成一條寫入命令。
AOF重寫不會阻塞主進程,而是建立一個帶有服務器進程的數據副本的子進程,保證在使用鎖的狀況下數據安全性。
Redis服務器設置有一個AOF重寫緩衝區,這個緩衝區是在子進程建立後,Redis主進程每執行一條寫命令,同時會將寫命令發送到AOF緩衝區和AOF重寫緩衝區,保證了AOF在重寫時數據同步問題。
AOF重寫完成後,向父進程發送信號,父進程將內容寫入新的AOF文件,並更名覆蓋掉原先的AOF文件,完成新舊文件的替換,在這個過成功,只有信號處理函數執行時 ,服務器進程形成阻塞,AOF後臺重寫不會阻塞進程。
天天學一點,總會有收穫。
說明:尊重做者知識產權,文中內容參考《Redis設計與實現》,僅在此作學習與你們分享。