redis持久化之RDB and AOF原理

redis官方提供了兩種持久化方式

RDB   和 AOF。

 

RDB(快照):

快照是基於內存數據的二進制序列化形式,

redis是單線程程序,使用多了多路複用api,但是rdb是io文件操作,io文件操作是不可以使用多路複用技術的。

所以rdb使用了操作系統的多線程cow(Copy on Write)機制實現快照持久化,這個機制很少人知道。

redis在持久化的時候會調用glibc的函數fork產生一個子線程,持久化處理交給子線程處理,主線程繼續處理線上請求。

子線程做數據持久化,不會修改現在的內存數據結構,它只是對數據結構進行遍歷讀取,然後序列化到磁盤裏,但是主線程不一樣,它必須持續服務客戶端請求,然後對內存裏的數據進行修改。

調用方式:

手動調用執行save和bgsave命令可以手動觸發RDB持久化

--save前臺調用會阻塞當前服務器,知道RDB完成爲止,如果數據量大的話會造成服務器的阻塞,線上環境一般不推薦使用

--bgsave後臺調用,執行bgsave命令時候redis進程會fork一個子進程來完成io文件操作,完成後自動結束,只有fork的時候會阻塞主線程,時間很短,推薦使用

自動調用通過設置配置文件,配置redis.config文件如下:

save <seconds> <changes>
save 900 1

 這個命令指的是如果900秒內有一條key信息發生變化就執行bgsave。

在執行shutdown的時候,如果沒有開啓aof持久化,也會自行執行一次bgsave。

 

 

AOF:

aof日誌存儲的是redis服務器的順序指令序列,aof日誌只記錄對內存進行修改的指令記錄。

記錄的是resp通訊協議的命令存儲格式。

當你的redis數據全沒有了,通過aof恢復相當於重放,重新執行的之前所有寫命令操作,

當然存儲在文件裏面的都是resp格式的東西。

如果redis長期運行,aof的日誌會越來越長,如果發生宕機重啓,重放整個aof文件是很耗時的。導致redis會無法對

外提供服務,所有需要對aof日誌瘦身, 就用到了重寫機制

重寫機制:

每次都是生成一個aof文件,都會去掉一些重複和無用的命令,達到瘦身的需求。

調用方式:

1.可以手動調用bgrewriteaof命令。

2.也可以自動調用

auto-aof-rewrite-min-size 64MB
auto-aof-rewrite-min-percenrage 100

上面兩個配置表示: 
- 當AOF文件小於64MB的時候不進行AOF重寫 
噹噹前AOF文件比上次AOF重寫後的文件大100%的時候進行AOF重寫

 

 

Redis重啓時加載持久化文件的順序

--redis重啓的時候會優先加載aof文件,如果aof文件不存在再去加載rdb文件,

--如果aof文件和rdb文件都不存在,則直接啓動

--如果加載aof和rdb文件報錯,則啓動失敗

 

 

Redis4.0之後,很少使用rdb來恢復內存狀態, 因爲會丟失大量數據,我們通常使用aof重放,但是重放aof文件相對於

rdb要慢得多,這樣啓動會要很長時間,redis4.0爲了解決這個問題,新增了一個新的持久化方式選項-混合持久化,

aof重寫產生的文件同時包含rdb格式的內容和aof格式的內容,其中rdb格式的內容記錄所有的數據,aof記錄發生更改的數據,這樣就可以快速的生成重寫文件。

這個功能可以在redis.conf裏面開啓

aof-use-rdb-preamble no

 

以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章