Redis持久化之AOF

2021-09-23 18:54:24 字數 2424 閱讀 8278

aof是redis的另一種持久化方式。

什麼是aof?

aof的實現原理

aof相關配置(【redis的配置檔案】配置檔案的第934行

everysec:將aof_buf快取區的所有內容寫入到aof檔案,如果上次同步aof檔案的時間與當前時間大於1秒,那麼會再次對aof檔案進行同步,同步操作由乙個執行緒專門負責;不間斷的寫入,隔一秒同步一次,效率較快,安全性較高(異常時,最多丟失一秒資料)。

always:將aof_buf快取區的所有內容寫入並同步到aof檔案;不間斷的寫入和同步,效率最慢,安全性最高。

no:將aof_buf快取區的所有內容寫入到aof檔案,但不會進行同步操作,同步操作的時間由作業系統決定;不間斷寫入,效率最高,但是安全性最低(異常時,會丟失未同步資料)。

2) "no"

auto-aof-rewrite-percentage ,當前的aof檔案的大小超過上一次檔案大小的百分比時,會觸發重寫。

auto-aof-rewrite-min-size ,限制了允許重寫的最小檔案大小,當aof檔案達到這個值時,觸發重寫。

127.0.0.1:6379> config get auto-aof-rewrite-percentage

1) "auto-aof-rewrite-percentage"

2) "100"

127.0.0.1:6379> config get auto-aof-rewrite-min-size

1) "auto-aof-rewrite-min-size"

2) "67108864"

aof持久化會儲存每一條被執行的寫命令,那麼隨著伺服器執行時間的增長,對應的aof檔案內容會越來越多,檔案也會越來越大,從而對伺服器造成影響,為此,redis提供了檔案重寫的功能,來解決aof檔案過大問題,它是通過重寫程式aof_write實現的。具體是怎麼回事呢?舉個例子:

resp協議:就上面截圖中某條完整的命令為例,*4:你可以將*理解為開始標識,4表示該命令(rpush lista b c)總共四部分組成;$5:表示命令第一部分的長度,eg:rpush的長度為5。

經過了上面的4條新增/移除命令後,得到的結果是4個元素。

手動重寫下:

跟rpush lista n m b c命令是類似的,也就是說重寫不是依次讀取aof檔案的命令,而是直接去記錄了當前資料庫資料的最終值,這樣,伺服器就能以最少的命令記錄資料庫所有資料的狀態。

aof檔案重寫時,redis為了避免重寫操作時,伺服器執行緒被長時間阻塞的情況發生,將重寫程式放到子執行緒中執行,以保證伺服器能繼續處理客戶端發來的命令請求,這樣就可能出現資料庫狀態不一致。為解決這一問題,redis伺服器設定了aof重寫緩衝區,這個快取區在建立子執行緒進行重寫操作時會開始工作。子程序完成aof緩衝區的重後,會向父程序(伺服器程序)確定是否需要向檔案中繼續追加命令,如果存在新命令需要追加,則子程序會在追加完命令後再次向父程序確定,直到不需要再追加命令,最後,這個新aof檔案將會替換掉舊aof檔案。

如果有寫的不對的地方,請大家多多批評指正,非常感謝!

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...

redis持久化之AOF

號外號外,新建 redis 交流討論群 332160890,歡迎加入!一 說明 1.1aof 相關配置項 配置項作用aof rewrite perc 百分比閾值,當 aof的增量超過這個閾值時,開始 aof的 rewrite操作 aof rewrite min size 當aof 的檔案大小超過該值...

redis持久化之AOF

這個也是觸發aof的乙個機制 always 是每次資料變化都會記錄下來,並同步到磁碟 everysec 是每秒記錄,並同步到磁碟 no,寫入aof檔案,不會同步 下面我實際操作一下,截 釋一下但是這個問題redis也有相應的解決辦法 rewrite 他其實是增加了重寫機制,當檔案超過所定的閥值的時候...