Redis學習筆記(九) AOF持久化

除了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設計與實現》,僅在此作學習與你們分享。


 

 

相關文章
相關標籤/搜索