首頁技術文章正文

RDB持久化和AOF持久化有什么優(yōu)缺點?

更新時間:2021-05-07 來源:黑馬程序員 瀏覽量:

Redis 提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)。

RDB,簡而言之,就是在不同的時間點,將Redis 存儲的數(shù)據(jù)生成快照并存儲到磁盤等介質(zhì)上。

AOF,則是換了一個角度來實現(xiàn)持久化,那就是將Redis 執(zhí)行過的所有寫指令記錄下來,在下次Redis 重新啟動時,只要把這些寫指令從前到后再重復執(zhí)行一遍,就可以實現(xiàn)數(shù)據(jù)恢復了。

RDB 和AOF 兩種方式也可以同時使用,在這種情況下,如果Redis 重啟的話,則會優(yōu)先采用AOF 方式來進行數(shù)據(jù)恢復,這是因為AOF 方式的數(shù)據(jù)恢復完整度更高。

redis持久化


RDB

RDB持久化方式,是將Redis某一時刻的數(shù)據(jù)持久化到磁盤中,是一種快照式的持久化方法。

RDB持久化方式:Redis在進行數(shù)據(jù)持久化的過程中,會先將數(shù)據(jù)寫入到一個臨時文件中,待持久化過程都結束了,才會用這個臨時文件替換上次持久化好的文件。正是這種特性,讓我們可以隨時來進行備份,因為快照文件總是完整可用的。

對于RDB 方式,Redis 會單獨創(chuàng)建一個子進程來進行持久化,而主進程是不會進行任何IO 操作的,這樣就確保了Redis 極高的性能。

RDB優(yōu)點:如果需要進行大規(guī)模數(shù)據(jù)的恢復,且對于數(shù)據(jù)恢復的完整性不是非常敏感,那RDB 方式要比AOF 方式更加的高效。

RDB缺點:如果你對數(shù)據(jù)的完整性非常敏感,那么RDB 方式就不太適合你,因為即使你每5 分鐘都持久化一次,當Redis 故障時,仍然會有近5 分鐘的數(shù)據(jù)丟失。所以,Redis 還提供了另一種持久化方式,那就是AOF。


AOF

AOF方式是將執(zhí)行過的寫指令記錄下來,在數(shù)據(jù)恢復時按照從前到后的順序再將指令都執(zhí)行一遍。

實現(xiàn)方式:我們通過配置Redis.conf 中的appendonly yes 就可以打開AOF功能。如果有寫操作(如SET 等),Redis 就會被追加到AOF 文件的末尾。

AOF 持久化的方式:默認的AOF 持久化策略是每秒鐘fsync 一次(fsync是指把緩存中的寫指令記錄到磁盤中),因為在這種情況下,Redis 仍然可以保持很好的處理性能,即使Redis 故障,也只會丟失最近1 秒鐘的數(shù)據(jù)。

如果在追加日志時,恰好遇到磁盤空間滿或斷電等情況導致日志寫入不完整,也沒有關系,Redis 提供了Redis-check-aof 工具,可以用來進行日志修復。

因為采用了追加方式,如果不做任何處理的話,AOF 文件會變得越來越大,為此,Redis 提供了AOF 文件重寫(rewrite)機制,即當AOF 文件的大小超過所設定的閾值時,Redis 就會啟動AOF 文件的內(nèi)容壓縮,只保留可以恢復數(shù)據(jù)的最小指令集。舉個例子或許更形象,假如我們調(diào)用了100 次INCR 指令,在AOF 文件中就要存儲100 條指令,但這明顯是很低效的,完全可以把這100條指令合并成一條SET 指令,這就是重寫機制的原理。

AOF 優(yōu)點:我們通過一個場景再現(xiàn)來說明。某同學在操作Redis 時,不小心執(zhí)行了FLUSHALL,導致Redis 內(nèi)存中的數(shù)據(jù)全部被清空了,這是很悲劇的事情。不過這也不是世界末日,只要Redis 配置了AOF 持久化方式,且AOF文件還沒有被重寫(rewrite),我們就可以用最快的速度暫停Redis 并編輯AOF文件,將最后一行的FLUSHALL 命令刪除,然后重啟Redis,就可以恢復Redis的所有數(shù)據(jù)到FLUSHALL 之前的狀態(tài)了。是不是很神奇,這就是AOF 持久化方式的好處之一。但是如果AOF 文件已經(jīng)被重寫了,那就無法通過這種方法來恢復數(shù)據(jù)了。

AOF缺點:比如在同樣數(shù)據(jù)規(guī)模的情況下,AOF文件要比RDB文件的體積大。而且,AOF 方式的恢復速度也要慢于RDB 方式。

如果你直接執(zhí)行BGREWRITEAOF 命令,那么Redis 會生成一個全新的AOF文件,其中便包括了可以恢復現(xiàn)有數(shù)據(jù)的最少的命令集。

如果運氣比較差,AOF 文件出現(xiàn)了被寫壞的情況,也不必過分擔憂,Redis并不會貿(mào)然加載這個有問題的AOF 文件,而是報錯退出。這時可以通過以下步驟來修復出錯的文件:

1.備份被寫壞的AOF 文件。

2.運行Redis-check-aof –fix 進行修復。

3.用diff -u 來看下兩個文件的差異,確認問題點。

4.重啟Redis,加載修復后的AOF 文件。

1577370495235_學IT就到黑馬程序員.gif



猜你喜歡:

Redis集群有哪些方案??

為什么redis可以做緩存?

redis持久化:RDB持久化與AOF持久化

Redis 持久化詳細介紹

黑馬程序員Java開發(fā)培訓課程

分享到:
在線咨詢 我要報名
和我們在線交談!