Redis是基於記憶體儲存的資料庫,如果遇到服務重啟或者崩潰,記憶體中的資料將會被清空。所以為了確保資料安全性和可靠性,我們需要將記憶體中的資料持久化到磁碟上。
持久化不僅可以防止由於系統故障、重啟或者其他原因導致的資料丟失。還可以用於備份、資料恢復和遷移等操作。
Redis提供了兩種主要的持久化機制:RDB持久化和AOF持久化。此外,還可以採用混合持久化(RDB + AOF)的方式,將這兩種持久化方式結合在一起。下面我們簡要概述這些持久化機制。
RDB(Redis DataBase)持久化是一種基於快照的持久化方式。在指定的時間間隔內,如果滿足一定條件(如某段時間內發生的寫操作次數),Redis會生成一個包含當前記憶體資料的RDB檔案。這個RDB檔案可以用於資料恢復或備份。RDB持久化提供了較高的資料壓縮率和快速的資料載入速度,但可能存在一定程度的資料丟失。
AOF(Append Only File)持久化是一種基於紀錄檔的持久化方式。Redis將所有的寫操作命令記錄到一個AOF檔案中。當Redis重新啟動時,可以通過重放AOF檔案中的命令來恢復資料。AOF持久化提供了更高的資料安全性,可以保證資料的完整性。然而,與RDB持久化相比,AOF檔案通常較大,資料載入速度較慢。
混合持久化結合了RDB持久化和AOF持久化的優點,可以在保證資料安全性的同時,提供較快的資料載入速度。在這種持久化方式下,Redis會同時生成RDB檔案和AOF檔案。當Redis重新啟動時,優先使用AOF檔案恢復資料,以確保資料的完整性。混合持久化適用於對資料安全性和效能要求較高的場景。
RDB持久化是基於快照的持久化,把當前時刻全量資料持久化到磁碟上,最終生成一個RBD檔案。
RDB持久化可以通過以下幾種方式觸發:
手動觸發:使用SAVE
或BGSAVE
命令。SAVE
是同步命令,執行過程中會阻塞其他請求。BGSAVE
是非同步命令,主程序會forks一個子程序,進行非同步持久化,持久化過程中主程序仍然可以處理其他請求。
自動觸發:在組態檔中設定觸發條件,redis.conf設定如下:
# 900s內至少有一次寫操作
save 900 1
# 300s內至少有1次寫操作
save 300 10
# 60s內至少有10000次寫操作
save 60 10000
關閉Redis時觸發:Redis在關閉服務時會自動觸發一次RDB持久化。
主從同步時觸發:當從節點連線到主節點時,主節點會觸發一次RDB持久化,並將生成的RDB檔案傳送給從節點進行同步。
RDB持久化具有以下優點:
RDB持久化的缺點包括:
AOF(Append Only File)持久化是一種基於紀錄檔的持久化方式。Redis將所有的寫操作命令追加到一個AOF檔案中。當Redis重新啟動時,可以通過重放AOF檔案中的命令來恢復資料。
AOF持久化的設定主要包括以下幾個方面:
啟用AOF持久化:在組態檔中設定appendonly yes
。
# 開啟aof持久化
appendonly yes
# aof檔名
appendfilename "appendonly.aof"
AOF檔案同步策略:在組態檔中設定appendfsync
選項。可選值包括:
always
:每次寫操作都同步到磁碟,保證最高的資料安全性,但效能較差。everysec
:每秒同步一次磁碟,提供較好的資料安全性和效能平衡。no
:由作業系統決定何時同步磁碟,效能最好,但資料安全性較差。# 持久化策略,always表示每次寫入都進行持久化
appendfsync always
AOF重寫策略:在redis.conf檔案中進行設定,控制AOF重寫的觸發條件。
# 指定在執行BGSAVE或BGREWRITEAOF命令時是否禁用AOF檔案同步。預設為yes,表示禁用同步。
no-appendfsync-on-rewrite yes
# 定AOF檔案大小增長到原始大小的百分比時進行重寫。
# 預設為100,表示AOF檔案大小增長到原始大小的兩倍時進行重寫。
auto-aof-rewrite-percentage 100
# 指定進行AOF重寫的最小AOF檔案大小。預設為64mb。
auto-aof-rewrite-min-size 64
隨著寫操作的不斷進行,AOF檔案會不斷增長。為了減小AOF檔案的大小,Redis提供了AOF重寫功能。AOF重寫會建立一個新的AOF檔案,只包含當前記憶體中資料的最小命令集。在重寫過程中,Redis會繼續將新的寫操作追加到原始AOF檔案中。當重寫完成後,新的AOF檔案將替換原始AOF檔案。
可以手動執行bgrewriteaof命令,觸發AOF重寫。
redis> bgrewriteaof
AOF持久化具有以下優點:
AOF持久化的缺點包括:
RDB持久化載入速度快,AOF持久化資料更安全,有沒有一種持久化方式結合兩者的優點?
當然有,就是混合持久化。
Redis首先使用RDB持久化將記憶體中的資料快照儲存到磁碟上,然後再使用AOF持久化將所有新的寫操作追加到AOF檔案中。這樣做的好處是:
混合持久化具有以下優點:
混合持久化的缺點包括:
較大的儲存空間:需要同時維護RDB檔案和AOF檔案,可能佔用較多的磁碟空間。
混合持久化適用於對資料安全性和效能要求較高的場景,尤其是在以下情況:
持久化方式 | RDB | AOF |
---|---|---|
原理 | 通過定期生成資料快照實現持久化 | 通過記錄所有寫操作命令實現持久化 |
資料安全性 | 可能會丟失最近一次快照以來的資料 | 更高,可通過設定同步策略降低資料丟失風險 |
恢復速度 | 較快,因為RDB檔案是一個資料快照 | 較慢,需要逐條執行AOF檔案中的命令 |
儲存空間 | 一般較小,因為RDB檔案經過壓縮 | 一般較大,但可以通過AOF重寫減小檔案大小 |
效能影響 | 較小,因為快照生成過程較短 | 可能較大,但可通過設定同步策略降低效能影響 |
主從同步 | 使用RDB檔案進行同步,同步速度較快 | 使用AOF檔案進行同步,同步速度可能較慢 |
應用場景 | 適用於對資料安全性要求較低、恢復速度要求較高的場景 | 適用於對資料安全性要求較高、可接受較慢恢復速度的場景 |
如果同時開啟了RDB和AOF持久化,Redis優先使用AOF持久化,因為AOF持久化可以保證更高的資料安全性和靈活性,而RDB持久化適用於資料恢復的場景。
在選擇Redis持久化方案時,需要根據實際業務需求和場景權衡各個方案的優缺點。
本文介紹了Redis的三種持久化機制:RDB持久化、AOF持久化和混合持久化。
RDB持久化通過定期生成資料快照實現持久化,具有快速恢復和更小的儲存空間等優點,但可能存在資料丟失和子程序佔用記憶體等缺點。
AOF持久化通過記錄所有寫操作命令實現持久化,具有更高的資料安全性和更好的容錯性等優點,但可能存在較大的儲存空間和資料載入速度較慢等缺點。
混合持久化結合了RDB持久化和AOF持久化的優點,適用於對資料安全性和效能要求較高的場景。
在選擇Redis持久化方案時,需要根據實際業務需求和場景權衡各個方案的優缺點。
我是「一燈架構」,如果本文對你有幫助,歡迎各位小夥伴點贊、評論和關注,感謝各位老鐵,我們下期見