Redis4.0之后可以使用RDB AOF混合方式進行持久化了,說到持久化,持久化在Redis里有兩種使用場景
1 服務器重啟的時候可以加載持久化文件恢復數據
2 AOF由於是采用順序寫的方式,所以經過一定的時間舊的AOF就不夠新了需要進行重寫保證數據一致性
現在看看怎么開啟混合模式
# When rewriting the AOF file, Redis is able to use an RDB preamble in the # AOF file for faster rewrites and recoveries. When this option is turned # on the rewritten AOF file is composed of two different stanzas: # # [RDB file][AOF tail] # # When loading Redis recognizes that the AOF file starts with the "REDIS" # string and loads the prefixed RDB file, and continues loading the AOF # tail. # # This is currently turned off by default in order to avoid the surprise # of a format change, but will at some point be used as the default. aof-use-rdb-preamble no
把 aof-use-rdb-preamble 配成 yes就行了
上面的注釋說了,開啟了aof-use-rdb-preamble后,在對AOF進行重寫的時候,AOF文件前半部分是RDB格式,后半部分是AOF格式
我們可以做個實驗,下面是我在測試環境開啟了aof-use-rdb-preamble后,手動執行下BGREWRITEAOF后生成的 appendonly.aof文件的內容
REDIS0008?redis-ver4.0.1?redis-bits繞?ctime聮~`?used-mem?? ?aof-preamble??repl-id(6c3378899b63bc4ebeaafaa09c27902d514eeb1f?repl-offset??? list1?77 / appleorangegrape?e k1v1彝髖S[zb*2 $6 SELECT $1 0 *3 $4 sadd $8 gamedisk $4 nioh *3 $4 sadd $8 gamedisk $4 tomb
前半部分是RDB格式,后半部分是AOF格式
關於AOF重寫
順便復習一下AOF重寫吧
比如說一個客戶端執行了五次下面的命令
RPUSH A
RPUSH B
RPUSH C
RPUSH D
RPUSH E
那么AOF文件中會把這5條記錄完整記錄下來,其實這5句使用一句就能解決RPUSH A B C D E。順帶一提 剛剛查了下List的操作,發現獲取元素只有一個命令那就是LRANGE
對於LIST,SET,HASH都是采用這種方式進行的壓縮處理
偽代碼如下
如果一個list或者set的成員數超過了64,重寫的時候會分成多個語句,也就是說RPUSH 或者 SADD 中的成員不會超過64
三 AOF重寫過程
1 fork出一個子進程,子進程調用上面偽代碼的邏輯,生成新的AOF文件
2 在子進程生成aof文件期間,新的請求會緩存到AOF緩沖區,這是因為現在舊的AOF文件還是存在的,還是要每秒一次的頻率寫入的
3 除了AOF緩沖區,還有一個AOF重寫緩沖區,客戶端的操作也會保存到AOF重寫緩沖區
當子進程完成AOF重寫工作后,它會想父進程發送一個信號,父進程在收到信號之后,會調用一個信號處理函數,並執行以下工作
1 將AOF重寫緩沖區的所有內容寫入到新的AOF文件中,這時新的AOF文件所保存的數據庫狀態和服務器當前的數據庫狀態一致
2 對新的AOF文件進行改名,原子地覆蓋現有的AOF文件,完成文件替換
在主進程處理該信號期間,不會響應客戶端請求