Redis設計與實現 十 AOF持久化

2022-07-10 21:24:09 字數 1341 閱讀 2390

上個文章說到了rdb的持久化的過程以及rdb的檔案是如何進行儲存的。

和rdb不同的是,aof的操作是通過把指令乙個個儲存入檔案的,進行載入的時候就是乙個個的command進行讀取,也就是模擬了一遍某時間段內的所有的操作。

aof持久化需要將所有寫命令記錄在檔案中來儲存伺服器狀態,而檔案寫入操作效率比較低,如果每執行一條寫命令都要寫一次aof檔案無疑是低效的。為了提高效率,redis提供了乙個中間層 – aof緩衝區,也就是說當redis執行一條寫命令後,先將該命令追加到aof緩衝區中,在以後的某個時刻再將aof緩衝區中的內容同步到檔案中。當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加到伺服器狀態的aof_buf緩衝區的末尾:

在載入aof的時候

由於aof是通過不斷追加寫命令來記錄資料庫狀態,所以伺服器執行比較久之後,aof檔案中的內容會越來越多,磁碟占有量越來越大,同時也是使通過過aof檔案還原資料庫的需要的時間也變得很久。所以就需要通過讀取伺服器當前的資料庫狀態來重寫新的aof檔案。新的aof檔案不會包含任何浪費空間的冗餘命令,所以會比舊的aof檔案小很多。

由於aof重寫是會進行大量寫入操作,勢必為長時間阻塞主程序,因此redis把重寫程式放到子程序執行。

這樣做有兩點好處

1)子程序重寫期間,主程序可以繼續處理命令。

2)子程序帶有主程序的資料副本,這樣就可以避免與主程序競爭db->dict,這是執行緒實現不了的。

重寫期間,主程序繼續處理命令,對資料庫狀態進行修改,這樣使得當前的資料庫狀態與重寫的aof檔案所儲存的資料庫狀態不一致。因此,redis設定了aof重寫緩衝區,在建立子程序後,主程序每執行乙個寫命令都會寫到重寫緩衝區。在子程序完成重寫後,主程序會將aof重寫緩衝區的資料寫入到重寫的aof檔案,保證資料狀態的一致。

《Redis設計與實現》 AOF持久化

redis aof 持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。aof持久化 當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令後,會以協議格式將被執行的寫命令追加到伺服器狀態的 aof buf快取區的末尾。檔案的寫入和同步 為了提高檔案的寫入效率,在現代作業系統中,當...

《Redis設計與實現》 AOF持久化

redis aof 持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。aof持久化 當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令後,會以協議格式將被執行的寫命令追加到伺服器狀態的 aof buf快取區的末尾。檔案的寫入和同步 為了提高檔案的寫入效率,在現代作業系統中,當...

《Redis設計與實現》之第十一章 AOF持久化

aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式 純文字 儲存的。一,aof持久化的實現 1.命令追加 當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令後,會以協議格式把被執行的寫命令追加到伺服器狀態的ao...