redis持久化方式對比

RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。redis

  AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。數據庫

三、兩者優缺點

RDB存在哪些優點呢?

  1). 一旦採用該方式,那麼你的整個Redis數據庫將只包含一個文件,這對於文件備份而言是很是完美的。好比,你可能打算每一個小時歸檔一次最近24小時的數據,同時還要天天歸檔一次最近30天的數據。經過這樣的備份策略,一旦系統出現災難性故障,咱們能夠很是容易的進行恢復。緩存

  2). 對於災難恢復而言,RDB是很是不錯的選擇。由於咱們能夠很是輕鬆的將一個單獨的文件壓縮後再轉移到其它存儲介質上。安全

  3). 性能最大化。對於Redis的服務進程而言,在開始持久化時,它惟一須要作的只是fork出子進程,以後再由子進程完成這些持久化的工做,這樣就能夠極大的避免服務進程執行IO操做了。服務器

  4). 相比於AOF機制,若是數據集很大,RDB的啓動效率會更高。架構

RDB又存在哪些劣勢呢?app

  1). 若是你想保證數據的高可用性,即最大限度的避免數據丟失,那麼RDB將不是一個很好的選擇。由於系統一旦在定時持久化以前出現宕機現象,此前沒有來得及寫入磁盤的數據都將丟失。異步

  2). 因爲RDB是經過fork子進程來協助完成數據持久化工做的,所以,若是當數據集較大時,可能會致使整個服務器中止服務幾百毫秒,甚至是1秒鐘。工具

AOF的優點有哪些呢?

  1). 該機制能夠帶來更高的數據安全性,即數據持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不一樣步。事實上,每秒同步也是異步完成的,其效率也是很是高的,所差的是一旦系統出現宕機現象,那麼這一秒鐘以內修改的數據將會丟失。而每修改同步,咱們能夠將其視爲同步持久化,即每次發生的數據變化都會被當即記錄到磁盤中。能夠預見,這種方式在效率上是最低的。至於無同步,無需多言,我想你們都能正確的理解它。性能

  2). 因爲該機制對日誌文件的寫入操做採用的是append模式,所以在寫入過程當中即便出現宕機現象,也不會破壞日誌文件中已經存在的內容。然而若是咱們本次操做只是寫入了一半數據就出現了系統崩潰問題,不用擔憂,在Redis下一次啓動以前,咱們能夠經過redis-check-aof工具來幫助咱們解決數據一致性的問題。

  3). 若是日誌過大,Redis能夠自動啓用rewrite機制。即Redis以append模式不斷的將修改數據寫入到老的磁盤文件中,同時Redis還會建立一個新的文件用於記錄此期間有哪些修改命令被執行。所以在進行rewrite切換時能夠更好的保證數據安全性。

  4). AOF包含一個格式清晰、易於理解的日誌文件用於記錄全部的修改操做。事實上,咱們也能夠經過該文件完成數據的重建。

AOF的劣勢有哪些呢?

  1). 對於相同數量的數據集而言,AOF文件一般要大於RDB文件。RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。

  2). 根據同步策略的不一樣,AOF在運行效率上每每會慢於RDB。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB同樣高效。

兩者選擇的標準,就是看系統是願意犧牲一些性能,換取更高的緩存一致性(aof),仍是願意寫操做頻繁的時候,不啓用備份來換取更高的性能,待手動運行save的時候,再作備份(rdb)。rdb這個就更有些 eventually consistent的意思了。

四、經常使用配置

RDB持久化配置

  Redis會將數據集的快照dump到dump.rdb文件中。此外,咱們也能夠經過配置文件來修改Redis服務器dump快照的頻率,在打開6379.conf文件以後,咱們搜索save,能夠看到下面的配置信息:

  save 900 1              #在900秒(15分鐘)以後,若是至少有1個key發生變化,則dump內存快照。

  save 300 10            #在300秒(5分鐘)以後,若是至少有10個key發生變化,則dump內存快照。

  save 60 10000        #在60秒(1分鐘)以後,若是至少有10000個key發生變化,則dump內存快照。

AOF持久化配置

image.png

  在Redis的配置文件中存在三種同步方式,它們分別是:

    appendfsync always     #每次有數據修改發生時都會寫入AOF文件。

    appendfsync everysec  #每秒鐘同步一次,該策略爲AOF的缺省策略。

    appendfsync no          #從不一樣步。高效可是數據不會被持久化。

持久化方案選擇

在實際生產環境中,根據數據量、應用對數據的安全要求、預算限制等不一樣狀況,會有各類各樣的持久化策略;如徹底不使用任何持久化、使用快照持久化或AOF持久化的一種,或同時開啓快照持久化和AOF持久化等。此外,持久化的選擇必須與Redis的主從策略一塊兒考慮,由於主從複製與持久化一樣具備數據備份的功能,並且主機master和從機slave能夠獨立的選擇持久化方案。

(1)若是Redis中的數據徹底丟棄也沒有關係(如Redis徹底用做DB層數據的cache),那麼不管是單機,仍是主從架構,均可以不進行任何持久化。

(2)在單機環境下(對於我的開發者,這種狀況可能比較常見),若是能夠接受十幾分鍾或更多的數據丟失,選擇快照持久化對Redis的性能更加有利;若是隻能接受秒級別的數據丟失,應該選擇AOF。

(3)但在多數狀況下,咱們都會配置主從環境,slave的存在既能夠實現數據的熱備,也能夠進行讀寫分離分擔Redis讀請求,以及在master宕掉後繼續提供服務。在這種狀況下,一種可行的作法是:master:徹底關閉持久化,這樣可讓master的性能達到最好。 slave:關閉快照持久化,開啓AOF(若是對數據安全要求不高,開啓快照持久化關閉AOF也能夠),並定時對持久化文件進行備份(如備份到其餘文件夾,並標記好備份的時間);而後關閉AOF的自動重寫,而後添加定時任務,在天天Redis閒時(如凌晨12點)調用bgrewriteaof。

相關文章
相關標籤/搜索