aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。
當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加到伺服器狀態的aof_buf緩衝區末尾:
struct redisserver;例如 redis>set key value
那麼伺服器在執行這個set命令之後,會將以下協議內容追加到aof_buf緩衝區的末尾:
*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n
redis伺服器程序就是乙個事件迴圈(loop),這個迴圈中的檔案事件負責接收客戶端的命令請求,以及向客戶端傳送命令回覆,而時間事件則負責執行像servercron函式這樣需要定時執行的函式。
aof_buf緩衝區的內容寫入和儲存到aof檔案裡面。
def eventloop():
while true:
//處理檔案事件,接收命令請求以及傳送命令回覆
//處理命令請求時可能會有新內容被追加到aof_buf緩衝區
processfileevents()
//處理時間事件
processtimeevents()
//考慮是否將aof_buf中的內容寫入和儲存到aof檔案裡面
因為aof檔案裡面包含了重建資料庫狀態所需的所有寫命令,所以伺服器只要讀入並重新執行一遍aof檔案裡面儲存的寫命令,就可以還原伺服器關閉之前的資料庫狀態。
redis讀取aof檔案並還原資料的具體步驟如下:
1)建立乙個不帶網路連線的偽客戶端:因為redis的命令只能在客戶端上下文中執行,而載入aof檔案時所使用的命令直接**於aof檔案而不是網路連線,所以伺服器使用偽客戶端來執行aof檔案儲存的寫命令,偽客戶端執行命令的效果和帶網路連線客戶端執行命令的效果完全一樣。
2)從aof檔案中分析並讀取一條寫命令
3)使用偽客戶端執行被讀出的寫命令
4)一直執行步驟2和步驟3,知道檔案讀取完畢
其實就是為了解決aof檔案體積膨脹的問題,redis提供了aof檔案重寫功能。
aof重寫程式是放在子程序裡執行的
redis持久化 AOF持久化
1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...
redis持久化之AOF
號外號外,新建 redis 交流討論群 332160890,歡迎加入!一 說明 1.1aof 相關配置項 配置項作用aof rewrite perc 百分比閾值,當 aof的增量超過這個閾值時,開始 aof的 rewrite操作 aof rewrite min size 當aof 的檔案大小超過該值...
Redis持久化之AOF
aof是redis的另一種持久化方式。什麼是aof?aof的實現原理 aof相關配置 redis的配置檔案 配置檔案的第934行 everysec 將aof buf快取區的所有內容寫入到aof檔案,如果上次同步aof檔案的時間與當前時間大於1秒,那麼會再次對aof檔案進行同步,同步操作由乙個執行緒專...