Redis有兩種持久化方案:
- RDB持久化
- AOF持久化
RDB持久化
RDB全稱Redis Database Backup file(Redis資料備份檔案),也被叫做Redis資料快照。簡單來說就是把記憶體中的所有資料都記錄到磁碟中。當Redis例項故障重啟後,從磁碟讀取快照檔案,恢復資料。快照檔案稱為RDB檔案,預設是儲存在當前執行目錄。
執行時機
RDB持久化在四種情況下會執行:
- (1) 執行
save
命令 - (2) 執行
bgsave
命令 - (3) Redis停機時
- (4) 觸發RDB條件時
(1)save
命令
執行下面的命令,可以立即執行一次RDB:
save命令會導致主程式執行RDB,這個過程中其它所有命令都會被阻塞。只有在資料遷移時可能用到。
(2)bgsave
命令
下面的命令可以非同步執行RDB:
這個命令執行後會開啟獨立程式完成RDB,主程式可以持續處理使用者請求,不受影響。
(3)停機時
Redis停機時會執行一次save命令,實現RDB持久化。
(4)觸發RDB條件
Redis內部有觸發RDB的機制,可以在redis.conf
檔案中找到,格式如下:
# 900秒內,如果至少有1個key被修改,則執行bgsave , 如果是save "" 則表示禁用RDB
save 900 1
save 300 10
save 60 10000
RDB的其它配置也可以在redis.conf
檔案中設定:
# 是否壓縮 ,建議不開啟,壓縮也會消耗cpu,磁碟的話不值錢
rdbcompression yes
# RDB檔名稱
dbfilename dump.rdb
# 檔案儲存的路徑目錄
dir ./
RDB原理
bgsave
開始時會fork主程式得到子程式,子程式共享主程式的記憶體資料。完成fork後讀取記憶體資料並寫入 RDB 檔案。
fork採用的是copy-on-write技術:
- 當主程式執行讀操作時,訪問共享記憶體;
- 當主程式執行寫操作時,則會複製一份資料,執行寫操作。
總結
RDB方式bgsave
的基本流程?
- fork主程式得到一個子程式,共享記憶體空間
- 子程式讀取記憶體資料並寫入新的RDB檔案
- 用新RDB檔案替換舊的RDB檔案
RDB會在什麼時候執行?`save 60 1000代表什麼含義?
- 預設是服務停止時
- 代表60秒內至少執行1000次修改則觸發RDB
RDB的缺點?
- RDB執行間隔時間長,兩次RDB之間寫入資料有丟失的風險
- fork子程式、壓縮、寫出RDB檔案都比較耗時
AOF持久化
AOF原理
AOF全稱為Append Only File(追加檔案)。Redis處理的每一個寫命令都會記錄在AOF檔案,可以看做是命令日誌檔案。
AOF配置
AOF預設是關閉的,需要修改redis.conf配置檔案來開啟AOF:
# 是否開啟AOF功能,預設是no
appendonly yes
# AOF檔案的名稱
appendfilename "appendonly.aof"
AOF的命令記錄的頻率也可以透過redis.conf檔案來配:
# 表示每執行一次寫命令,立即記錄到AOF檔案
appendfsync always
# 寫命令執行完先放入AOF緩衝區,然後表示每隔1秒將緩衝區資料寫到AOF檔案,是預設方案
appendfsync everysec
# 寫命令執行完先放入AOF緩衝區,由作業系統決定何時將緩衝區內容寫回磁碟
appendfsync no
三種策略對比:
AOF檔案重寫
因為是記錄命令,AOF檔案會比RDB檔案大的多。而且AOF會記錄對同一個key的多次寫操作,但只有最後一次寫操作才有意義。透過執行bgrewriteaof
命令,可以讓AOF檔案執行重寫功能,用最少的命令達到相同效果。
如圖,AOF原本有三個命令,但是set num 123 和 set num 666
都是對num的操作,第二次會覆蓋第一次的值,因此第一個命令記錄下來沒有意義。
所以重寫命令後,AOF檔案內容就是:mset name jack num 666
Redis也會在觸發閾值時自動去重寫AOF檔案。閾值也可以在redis.conf中配置:
# AOF檔案比上次檔案 增長超過多少百分比則觸發重寫
auto-aof-rewrite-percentage 100
# AOF檔案體積最小多大以上才觸發重寫
auto-aof-rewrite-min-size 64mb
RDB與AOF對比
RDB和AOF各有自己的優缺點,如果對資料安全性要求較高,在實際開發中往往會結合兩者來使用。