一. aof持久化
(三) aof檔案的載入和還原
(四) aof重寫
老規矩–妹妹鎮樓:
實現分為命令追加,檔案寫入,檔案同步三個步驟。
1. 命令追加
當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加到伺服器狀態的aof_buf緩衝區的末尾。
2. 寫入與同步
(1) always
將aof_buf緩衝區中的所有內容寫入並同步到aof檔案。效率最慢,但是最安全,最多丟失乙個時間迴圈中的命令資料。
(2) everysec
將aof_buf緩衝區中的所有內容寫入到aof檔案中,如果上次同步aof檔案的時間距離現在超過1s,那麼再次對aof檔案進行同步。最多丟失一秒鐘的命令資料。
(3) no
將aof_buf緩衝區中的所有內容寫入到aof檔案中,但不對aof檔案進行同步。會丟失上次同步aof檔案之後的所有寫命令資料。
redis讀取aof檔案並還原資料庫狀態的步驟如下:
1. 建立乙個不帶網路連線的偽客戶端,因為redis的命令只能在客戶端上下文中執行,而載入aof檔案時所使用的命令直接**於aof檔案而不是網路連線,所以伺服器使用了乙個沒有網路連線的偽客戶端。
2. 從aof檔案中分析並讀取一條寫命令
3. 使用偽客戶端執行被讀出的寫命令
4. 重複上述步驟,直到所有命令都被讀取出來。
1. 概述
隨著伺服器執行時間流逝,aof檔案中的內容會越來越多,檔案的體積也會越來越大,如果不控制的話,會對redis伺服器以及宿主機造成影響。因此,為了解決aof檔案體積膨脹的問題,redis提供了aof檔案重寫功能,伺服器會建立乙個新的aof檔案來替代現有的aof檔案,兩個aof檔案儲存的資料庫狀態相同,但新的aof檔案中不會包含浪費空間的冗餘命令,所以體積更小。
2. 實現
實際上,aof重寫不需要對現有的aof檔案進行任何讀取,分析,寫入操作,它是通過直接讀取當前的資料庫狀態實現的。如之前的aof檔案中記錄了對乙個鍵的5條寫入命令,那麼新的aof檔案直接記錄最新的乙個寫入命令即可,這就減少了aof檔案的體積。為了避免在執行命令時造成客戶端輸入緩衝區溢位,重寫程式會先檢查鍵所包含的元素數量,如果過多將使用多條命令來記錄鍵的值。
3. aof後台重寫
aof重寫程式aof_rewrite函式可以完成建立乙個新的aof檔案的任務,但是這個函式會進行大量的寫入操作,所以呼叫這個函式的執行緒會被長時間阻塞。由於redis伺服器採用單執行緒來處理命令請求,所以將aof重寫程式放到子程序中執行,使得父程序繼續處理命令請求。但是這樣在進行重寫的過程中,父程序對資料庫狀態的修改可能就會導致與重寫後的aof檔案狀態不一致。
為了解決這個問題,redis伺服器設定了乙個aof重寫緩衝區,在伺服器建立子程序之後開始使用,當伺服器執行完乙個寫命令之後,它會同時將這個寫命令傳送給aof緩衝區和aof重寫緩衝區,aof緩衝區中的內容會被定期寫入和同步到aof檔案中,而當子程序完成aof重寫工作後,它會向父程序傳送乙個訊號,父程序在接收到訊號後,會呼叫乙個訊號處理函式,將aof重寫緩衝區中的內容寫入到新的aof檔案中,這時的新aof檔案資料庫狀態與當前的資料庫是一致的。對新的aof檔案改名,覆蓋原aof檔案。
在整個aof後台重寫過程中,只有訊號處理函式會對伺服器程序阻塞,其他時候,aof後台重寫都不會阻塞父程序,將aof重寫對伺服器效能的影響降到最低。這也是bgrewriteaof命令的實現原理。
Redis學習之AOF八
aof是以日誌的形式來記錄每個寫操作,將redis執行過的所有寫指令記錄下來 讀操作不記錄 只許追加檔案但不可以改寫檔案,redis啟動之初會讀取改檔案重新構架資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。1.預設情況下 everysec 出廠預設...
redis持久化之AOF
號外號外,新建 redis 交流討論群 332160890,歡迎加入!一 說明 1.1aof 相關配置項 配置項作用aof rewrite perc 百分比閾值,當 aof的增量超過這個閾值時,開始 aof的 rewrite操作 aof rewrite min size 當aof 的檔案大小超過該值...
Redis之AOF資料備份
找到redis.conf配置檔案開啟aof 1 為什麼?aof採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當aof檔案的大小超過所設定的閾值時,redis就會啟動aof檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof。2 重寫原理?aof檔...