前言 Redis 提供了 2 個不同形式的持久化方式: RDB(Redis DataBase) AOF(Append Of File) RDB 在指定的時間間隔內將記憶體中的數據集快照寫入磁碟, 也就是行話講的 Snapshot 快照,它恢復時是將快照文件直接讀到記憶體里。 備份是如何執行的 Redis ...
前言
Redis 提供了 2 個不同形式的持久化方式:
-
RDB(Redis DataBase)
-
AOF(Append Of File)
RDB
在指定的時間間隔內
將記憶體中的數據集快照寫入磁碟, 也就是行話講的 Snapshot 快照,它恢復時是將快照文件直接讀到記憶體里。
備份是如何執行的
Redis 會單獨創建(fork)一個子進程來進行持久化,首先會將數據寫入到一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。整個過程中,主進程是不進行任何 IO 操作的,這就確保了極高的性能。如果需要進行大規模數據的恢復,且對於數據恢復的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。RDB 的缺點是最後一次持久化後的數據可能丟失
。
Fork
-
Fork 的作用是複製一個與當前進程一樣的進程。新進程的所有數據(變數、環境變數、程式計數器等) 數值都和原進程一致,但是是一個全新的進程,並作為原進程的子進程。
-
在 Linux 程式中,fork () 會產生一個和父進程完全相同的子進程,但子進程在此後多會 exec 系統調用,出於效率考慮,Linux 中引入了
“寫時複製技術”
。 -
一般情況父進程和子進程會共用同一段物理記憶體,只有進程空間的各段的內容要發生變化時,才會將父進程的內容複製一份給子進程。
RDB 持久化流程
dump.rdb 文件
rdb的預設配置文件名稱為dump.rdb
rdb文件的保存路徑,預設為 Redis 啟動時命令行所在的目錄下 “dir ./
”,也可以自己修改
如何觸發 RDB 快照-根據配置的策略
預設的配置策略如下圖:
舉例:save 60 10000
,意思是在60s內生成了10000個key,那麼redis就會以rbd的方式持久化數據,會先將數據保存在臨時文件中,然後用臨時文件替換掉當前的dump.rdb
命令 save VS bgsave
上面的例子使用的是save保存方式,redis中更推薦bgsave保存方式
-
save :save 時只管保存,其它不管,全部阻塞。手動保存,不建議。
-
bgsave:Redis 會在後臺非同步進行快照操作, 快照同時還可以響應客戶端請求。
-
可以通過 lastsave 命令獲取最後一次成功執行快照的時間。
rdb持久化的優勢
-
適合大規模的數據恢復
-
對數據完整性和一致性要求不高更適合使用
-
節省磁碟空間
-
恢復速度快
rdb持久化的劣勢
-
Fork 的時候,記憶體中的數據被克隆了一份,大致 2 倍的膨脹性需要考慮。
-
雖然 Redis 在 fork 時使用了寫時拷貝技術,但是如果數據龐大時還是比較消耗性能。
-
在備份周期在一定間隔時間做一次備份,所以如果 Redis 意外 down 掉的話,就會丟失最後一次快照後的所有修改。