Redis提供兩種備份方式:RDB 持久化機(jī)制和AOF 持久化機(jī)制
1、RDB持久化機(jī)制
會(huì)在指定時(shí)間點(diǎn)生成數(shù)據(jù)集快照,通過save(阻塞的)和bgsave(后臺(tái) fork 子進(jìn)程進(jìn)行不會(huì)阻塞主進(jìn)程處理命令請(qǐng)求)指令來生成RDB文件,如果需要恢復(fù)數(shù)據(jù),只需將備份文件 (dump.rdb) 移動(dòng)到 redis 安裝目錄并啟動(dòng)服務(wù)
優(yōu)點(diǎn)
- 比起 AOF,在數(shù)據(jù)量比較大的情況下,RDB的啟動(dòng)速度更快;
- RDB文件方便傳輸,可以在異地快速啟動(dòng)新服務(wù)
- 性能好,可以起fork子進(jìn)程,不影響主線程
缺點(diǎn)
- 數(shù)據(jù)丟失,假設(shè)5分鐘備份一次,在宕機(jī)的這5分鐘數(shù)據(jù)就丟失了
- 當(dāng)數(shù)據(jù)量很大時(shí),在 fork 子進(jìn)程備份過程中,會(huì)出現(xiàn)明顯的停頓現(xiàn)象
AOF 持久化機(jī)制
記錄 server 端收到的每一條寫命令,當(dāng) server 重啟時(shí)會(huì)進(jìn)行重放以此來重建之前的數(shù)據(jù)集。AOF 文件中的命令全部以 Redis 協(xié)議的格式來保存,新命令會(huì)被追加(append)到文件的末尾。 Redis 還可以在后臺(tái)對(duì) AOF 文件進(jìn)行重寫(rewrite) ,使得 AOF 文件的體積不會(huì)超出保存數(shù)據(jù)集狀態(tài)所需的實(shí)際大小。AOF 持久化實(shí)現(xiàn)可以分為命令追加(append)、文件寫入(write)、文件同步(fsync) 三個(gè)步驟。Append 追加命令到 AOF 緩沖區(qū),Write 將緩沖區(qū)的內(nèi)容寫入到程序緩沖區(qū),F(xiàn)sync 將程序緩沖區(qū)的內(nèi)容寫入到文件。
優(yōu)點(diǎn)
- 比RDB可靠。你可以制定不同的 fsync 策略:no、everysec 和 always。默認(rèn)是 everysec。這意味著你最多丟失一秒鐘的數(shù)據(jù)
- 當(dāng)AOF文件太大時(shí),Redis 會(huì)自動(dòng)在后臺(tái)進(jìn)行重寫。重寫很安全,因?yàn)橹貙懯窃谝粋€(gè)新的文件上進(jìn)行,同時(shí) Redis 會(huì)繼續(xù)往舊的文件追加數(shù)據(jù)。新文件上會(huì)寫入能重建當(dāng)前數(shù)據(jù)集的最小操作命令的集合。當(dāng)新文件重寫完,Redis 會(huì)把新舊文件進(jìn)行切換,然后開始把數(shù)據(jù)寫到新文件上
缺點(diǎn)
- AOF比較大,比RDB大
Redis 4.0 混合持久化
Redis 4.0 開始支持 RDB 和 AOF 的混合持久化(默認(rèn)關(guān)閉,可以通過配置項(xiàng) aof-use-rdb-preamble 開啟)。如果把混合持久化打開,AOF 重寫的時(shí)候就直接把 RDB 的內(nèi)容寫到 AOF 文件開頭。先以RDB格式寫入全量數(shù)據(jù),再追加增量日志,這樣既可以提高AOF Rewrite和恢復(fù)速度,也可以減少文件大小,還可以保證數(shù)據(jù)的完畢性。這樣做的好處是可以結(jié)合 RDB 和 AOF 的優(yōu)點(diǎn), 快速加載同時(shí)避免丟失過多的數(shù)據(jù)。當(dāng)然缺點(diǎn)也是有的, AOF 里面的 RDB 部分就是壓縮格式不再是 AOF 格式,可讀性較差。