redis持久化RDB和AOF對比

前言

對於redis來說,持久化是必不可少的
持久化主要做災難恢復,數據恢復
當redis掛了,那redis就不可用了,這樣redis就無法做到高可用性
重啓redis,如果redis發生了數據災難,重啓之後也是不可用的,沒有數據備份,數據也就沒有了
redis 的持久化主要有兩種方式:RDB和AOF

RDB和AOF介紹

RDB持久化機制,對redis中的數據執行週期性的持久化
AOF持久化機制,對每條寫入命令作爲日誌,以append-only的模式寫入一個日誌文件中,在進行redis重啓時,可以通過回放AOF日誌中的寫入指令來重構整個數據集

如果我們僅僅是想用redis作爲純內存的緩存用,就可以禁用AOF和RDB的所有持久化機制

通過RDB和AOF,可以將redis內存中的數據持久化到磁盤上面,然後將這些數據備份到其它地方,如雲平臺
如果redis掛了,或者存放redis 的服務器掛了,徹底無法恢復,可以從雲平臺拷貝回來之前的數據

如果同時使用兩種RDB和AOF持久化機制,redis重啓時,會優先使用AOF來重構數據,AOF數據更加完整

RDB持久化的特點

  1. RDB會生成多個數據文件,每個數據文件代表某一時刻中redis的數據,這種多個數據文件的方式,非常適合做冷備,可以將這些數據文件存放到雲上去,以定期備份策略來定期備份redis中的數據

    RDB可以做冷備,生成多個文件,每個文件代表某一時刻的完整的數據快照
    AOF也可以做冷備,只有一個文件,你可以每個一定時間,去copy一份這個文件

    RDB做冷備,優點是:由redis去控制固定時長生成快照文件,比較方便
    AOF做冷備,需要自己去手寫定時腳本
    RDB做冷備,數據恢復,速度比AOF快

  2. RDB對redis對外提供讀寫服務,影響非常小,可以保持redis高性能,因爲redis主進程只需要fork一個子進程,讓子進程執行磁盤IO操作來執行RDB持久化

    RDB,每次寫,都是寫入內存,在一定時候,纔會把數據寫入磁盤中
    AOF,每次都是要寫文件,雖然可以快速寫入os cache,但是,還是需要一定的時間開銷,比RDB慢

  3. 相對於AOF持久化機制來說,直接基於RDB數據文件來重啓和恢復redis進程,更加快速
    AOF,存放的是指令日誌,做恢復的時候,需要回放和執行所有指令日誌
    RDB,就是一份數據文件,恢復時,直接加載到內存中

AOF持久化的特點

  1. 對於同一份數據而言,AOF文件要比RDB文件更大
  2. AOF開啓後,支持的寫QPS(每秒查詢量)要比RDB的QPS低,因爲AOF一般會設置成每秒fsync一次日誌,當然,每秒性能也是很高。如果要保證一條數據不丟失,可以設置成每寫入一條數據,fsync一次,但是這樣QPS會下降很多
  3. 唯一的缺點,其實就是做數據恢復的時候,比較慢,做冷備時,定期的備份,不方便,要手寫複雜的腳本去做

RDB和AOF如何選擇

  1. 不要僅僅使用RDB,那樣會丟失很多數據
  2. 也不要僅僅使用AOF,那樣會存在兩個問題,第一,使用AOF做冷備,沒有RDB恢復的快。第二,RDB每次簡單粗暴的生成數據快照,更加健壯,可以避免AOF這種複雜的備份和恢復機制的bug
  3. 綜合考慮,用AOF來保證數據的不丟失,作爲數據恢復的第一選擇
    用RDB做冷備,在AOF文件丟失或損壞不可用的時候,還可以用RDB來進行快速的數據恢復
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章