Redis提供了多種不一樣級別的持久化方式:redis
- RDB 持久化能夠在指定的時間間隔內產生數據集的時間點快照(point-in-time snapshot)
- AOF持久化記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集。AOF文件中的命令所有以Redis協議的格式來保存,新命令會被追加到文件的末尾.Redis還能夠在後臺對AOF文件進行重寫(rewrite),使得AOF文件的體積不會超過保存數據集狀態所需的實際大小。
- Redis還能夠同時使用AOF和RDB持久化。在這種狀況下,當Redis重啓時,它會優先使用AOF文件來還原數據集,由於AOF文件保存的數據集一般比RDB文件所保存的數據集更完整。
- 能夠關閉持久化功能,讓數據只在服務器運行時存在。
RDB的優勢
- RDB是一個很緊湊的文件,它保存了redis在某個時間點上的數據集。
- RDB很是適用於災難恢復,它只有一個文件,而且內容緊湊,能夠將它傳送到別的數據中心
- 能夠最大化redis的性能;父進程在保存RDB文件時,惟一要作的就是fork一個子進程,而後這個子進程就會處理接下來的全部保存工做,父進程無需執行任何磁盤I/O操做
- RDB在恢復大數據集的時候比AOF的速度要快
RDB的缺點
- 由於RDB是保存在某個時間點上的數據集,這樣的話,服務器故障可能會丟失數據。
- 每次保存RDB的時候,redis要fork一個子進程,並由子進程來進行實際的持久化工做,在數據集比較大的時候,fork可能會很是耗時,可能會形成服務器中止處理客戶端請求;若是數據集很是巨大,而且cpu比較緊張的話,那麼 這種中止時間設置可能會長達整整1秒。雖然AOF重寫也須要進行fork,但不管AOF重寫的執行間隔有多長,數據的耐久性都不會有任何損失
AOF優勢
- 使用AOF持久化會讓redis變得很是耐久,你能夠設置不一樣的fsync策略,好比無fsync,每秒鐘一次fsync,或者每次寫入命令是fsync。AOF的默認策略爲每秒鐘fsync一次,在這種配置下,redis仍然能夠保持良好的性能,而且就算髮生故障停機,也最多隻會丟失一秒鐘的數據
- AOF文件只是一個日誌文件追加操做(append only log),所以對AOF文件的寫入不須要進行seek,即便日誌由於某些緣由而包含了未寫入完整命令(好比寫入時, 磁盤滿了,寫入時中途停機等),redis-check-aof工具能夠輕易的修復這種問題
- redis能夠在AOF文件體積過大時,自動在後臺對AOF進行重寫,重寫後的AOF文件包含了恢復當前數據集所需的最小命令集合。這個重寫操做是絕對安全的,由於redis在建立新的AOF過程當中,會繼續講命令追加到現有的AOF文件裏面,即便重寫過程當中發生停機,現有的AOF文件也不會丟失,而一旦新AOF文件建立完畢,redis就會從舊文件切換到新AOF文件,並開始對新AOF文件進行追加操做
- AOF文件有序地保存了對數據庫執行的全部寫入操做,這些寫入操做以redis協議的格式保存,所以AOF文件的內容很是容易被人讀懂,對文件進行分析也很容易。處處AOF文件也很是簡單。
AOF缺點
- 對於相同的數據來講,AOF文件的體積一般要大於RDB文件的體積
- 根據所使用的fsync策略。AOF的速度可能會慢於RDB。
- AOF的bug,曾經由於個別命令的緣由,致使AOF文件在從新載入是,沒法將數據集恢復成保存時的樣子。