redis持久化 RDB & AOF
Redis 提供了兩種不同形式的持久化方式
- RDB (Redis Data Base)
- AOF (Append of File)
一、RDB
在指定時間間隔內將記憶體中的資料集快照寫入磁碟,恢復時是將快照檔案直接讀到記憶體
備份
單獨建立一個子程序來進行持久化,將資料先寫到臨時檔案,在用臨時檔案替換上次持久化好的檔案
儲存策略
save 300 10(在配置檔案中有)
redis.conf中的設定項
1.stop-writes-on-bgsave-error yes
當Redis無法寫入磁碟的話,直接關掉Redis的寫操作
2.rdbcompression yes
進行rdb儲存時,將檔案壓縮
3.rdbchecksum yes
在儲存快照後,還可以讓Redis使用CRC64演算法來進行資料校驗,但是這樣做會增加大約10%的效能消耗,如果希望獲取到最大的效能提升,可以關閉此功能
優缺點
1.優點
- 節省磁碟空間
- 恢復速度快
2.缺點
- 資料較大時,消耗效能
- Redis如果意外掛掉,會丟失最後一次快照後的資料
二、AOF
以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),只許追加檔案但不可以改寫檔案,Redis啟動之初會讀取該檔案重新構建資料,換言之,Redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。
AOF預設不開啟,需要手動在配置檔案配置
可以在redis.conf中配置檔名稱,預設為 appendonly.aof
AOF檔案的儲存路徑,同RDB的路徑一致。
如遇到AOF檔案損壞,可通過 redis-check-aof --fix appendonly.aof 進行恢復
重寫 Rewrite
AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof。
Redis如何實現重寫?
AOF檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似。
重寫時機
系統載入時或者上次重寫完畢時,Redis會記錄此時AOF大小,設為base_size,
如果Redis的AOF當前大小>= base_size +base_size*100% (預設)且當前大小>=64mb(預設)的情況下,
Redis會對AOF進行重寫。
AOF優缺點
1.優點
- 備份機制更穩健,丟失資料概率更低。
- 可讀的日誌文字,通過操作AOF穩健,可以處理誤操作。
2.缺點
- 比起RDB佔用更多的磁碟空間。
- 恢復備份速度要慢。
- 每次讀寫都同步的話,有一定的效能壓力。
- 存在個別Bug,造成恢復不能。
為了資料安全,建議兩個都啟用。
redis叢集搭建。