Redis持久化之混合aof,rdb


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文件,完成文件替換

  在主進程處理該信號期間,不會響應客戶端請求

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM