Redis AOF持久化的實現

2022-07-10 17:03:10 字數 2191 閱讀 1495

當 aof 持久化功能處於開啟狀態時, 伺服器在執行完乙個寫命令之後, 會以協議格式將被執行的寫命令追加到伺服器狀態的aof_buf緩衝區的末尾:

struct

redisserver ;

舉個例子, 如果客戶端向伺服器傳送以下命令:

redis>set key value

ok

那麼伺服器在執行這個 set 命令之後, 會將以下協議內容追加到aof_buf緩衝區的末尾:

*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n
又比如說, 如果客戶端向伺服器傳送以下命令:

redis> rpush numbers one two three 

(integer) 3

那麼伺服器在執行這個 rpush 命令之後, 會將以下協議內容追加到aof_buf緩衝區的末尾:

*5\r\n$5\r\nrpush\r\n$7\r\nnumbers\r\n$3\r\none\r\n$3\r\ntwo\r\n$5\r\nthree\r\n
以上就是 aof 持久化的命令追加步驟的實現原理。

redis 的伺服器程序就是乙個事件迴圈(loop), 這個迴圈中的檔案事件負責接收客戶端的命令請求, 以及向客戶端傳送命令回覆, 而時間事件則負責執行像servercron函式這樣需要定時執行的函式。

def eventloop():

while

true:

# 處理檔案事件,接收命令請求以及傳送命令回覆

# 處理命令請求時可能會有新內容被追加到 aof_buf 緩衝區中

processfileevents()

# 處理時間事件

processtimeevents()

# 考慮是否要將 aof_buf 中的內容寫入和儲存到 aof 檔案裡面

為了提高檔案的寫入效率, 在現代作業系統中, 當使用者呼叫write函式, 將一些資料寫入到檔案的時候, 作業系統通常會將寫入資料暫時儲存在乙個記憶體緩衝區裡面, 等到緩衝區的空間被填滿、或者超過了指定的時限之後, 才真正地將緩衝區中的資料寫入到磁碟裡面。

這種做法雖然提高了效率, 但也為寫入資料帶來了安全問題, 因為如果計算機發生停機, 那麼儲存在記憶體緩衝區裡面的寫入資料將會丟失。

為此, 系統提供了fsyncfdatasync兩個同步函式, 它們可以強制讓作業系統立即將緩衝區中的資料寫入到硬碟裡面, 從而確保寫入資料的安全性。

舉個例子, 假設伺服器在處理檔案事件期間, 執行了以下三個寫入命令:

sadd databases "

redis""

mongodb""

mariadb

"set date

"2013-9-5

"incr click_counter

10086

那麼aof_buf緩衝區將包含這三個命令的協議內容

*5\r\n$4\r\nsadd\r\n$9\r\ndatabases\r\n$5\r\nredis\r\n$7\r\nmongodb\r\n$7

\r\nmariadb\r\n

*3\r\n$3\r\nset\r\n$4\r\ndate\r\n$8\r\n2013-9-5

\r\n

*3\r\n$4\r\nincr\r\n$13\r\nclick_counter\r\n$5\r\n10086\r\n

以上就是對 aof 持久化功能的檔案寫入和檔案同步這兩個步驟的介紹。

選項三個值當中最慢的乙個, 但從安全性來說,always也是最安全的, 因為即使出現故障停機, aof 持久化也只會丟失乙個事件迴圈中所產生的命令資料。

時, 伺服器在每個事件迴圈都要將aof_buf緩衝區中的所有內容寫入到 aof 檔案, 並且每隔超過一秒就要在子執行緒中對 aof 檔案進行一次同步: 從效率上來講,everysec模式足夠快, 並且就算出現故障停機, 資料庫也只丟失一秒鐘的命令資料。

Redis AOF 持久化方式

3 指定更新日誌條件 解說 4 配置重寫觸發機制 解說 當aof檔案大小是上次rewrite後大小的一倍且檔案大於64m時觸發。一般都設定為3g,64m太小了。隨著命令不斷寫入aof,檔案會越來越大,為了解決這個問題,redis引入了aof重寫機制壓縮檔案體積。aof檔案重 寫是將redis程序內的...

轉 Redis AOF 持久化詳解

redis 是一種記憶體資料庫,將資料儲存在記憶體中,讀寫效率要比傳統的將資料儲存在磁碟上的資料庫要快很多。但是一旦程序退出,redis 的資料就會丟失。為了解決這個問題,redis 提供了 rdb 和 aof 兩種持久化方案,將記憶體中的資料儲存到磁碟中,避免資料丟失。rdb的介紹在這篇文章中 r...

成為部落格專家 Redis AOF持久化設定

aof持久化,預設是關閉的,預設是開啟rdb持久化 開啟aof持久化機制之後,redis每次接收到一條寫命令,就會寫入日誌檔案中,當然是先寫入os cache的,然後每隔一定時間再fsync一下 而且即使aof和rdb都開啟了,redis重啟的時候,也是優先通過aof進行資料恢復的,因為aof資料比...