Redis持久化 (RDB和AOF) 梳理

上古南城發表於2023-09-21

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各有自己的優缺點,如果對資料安全性要求較高,在實際開發中往往會結合兩者來使用。

相關文章