最近在項目中使用到Redis做緩存,友善多個業務程序之間共享資料。由于Redis的資料都存放在記憶體中,如果沒有配置持久化,redis重新開機後資料就全丢失了,于是需要開啟redis的持久化功能,将資料儲存到磁盤上,當redis重新開機後,可以從磁盤中恢複資料。redis提供兩種方式進行持久化,一種是RDB持久化(原理是将Reids在記憶體中的資料庫記錄定時dump到磁盤上的RDB持久化),另外一種是AOF持久化(原理是将Reids的記錄檔以追加的方式寫入檔案)。那麼這兩種持久化方式有什麼差別呢,改如何選擇呢?網上看了大多數都是介紹這兩種方式怎麼配置,怎麼使用,就是沒有介紹二者的差別,在什麼應用場景下使用。
RDB持久化是指在指定的時間間隔内将記憶體中的資料集快照寫入磁盤,實際操作過程是fork一個子程序,先将資料集寫入臨時檔案,寫入成功後,再替換之前的檔案,用二進制壓縮存儲。
AOF持久化以日志的形式記錄伺服器所處理的每一個寫、删除操作,查詢操作不會記錄,以文本的方式記錄,可以打開檔案看到詳細的操作記錄。
RDB存在哪些優勢呢?
1). 一旦采用該方式,那麼你的整個Redis資料庫将隻包含一個檔案,這對于檔案備份而言是非常完美的。比如,你可能打算每個小時歸檔一次最近24小時的資料,同時還要每天歸檔一次最近30天的資料。通過這樣的備份政策,一旦系統出現災難性故障,我們可以非常容易的進行恢複。
2). 對于災難恢複而言,RDB是非常不錯的選擇。因為我們可以非常輕松的将一個單獨的檔案壓縮後再轉移到其它存儲媒體上。
3). 性能最大化。對于Redis的服務程序而言,在開始持久化時,它唯一需要做的隻是fork出子程序,之後再由子程序完成這些持久化的工作,這樣就可以極大的避免服務程序執行IO操作了。
4). 相比于AOF機制,如果資料集很大,RDB的啟動效率會更高。
RDB又存在哪些劣勢呢?
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持久化配置
在Redis的配置檔案中存在三種同步方式,它們分别是:
appendfsync always #每次有資料修改發生時都會寫入AOF檔案。
appendfsync everysec #每秒鐘同步一次,該政策為AOF的預設政策。
appendfsync no #從不同步。高效但是資料不會被持久化。
本文轉自 jiekegz 51CTO部落格,原文連結:http://blog.51cto.com/jacksoner/2049761