什么是redis的持久化?
RDB 持久化:該機制可以在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。
AOF 持久化:記錄服務器執行的所有寫操作命令,並在服務器啟動時,通過重新執行這些命令來還原數據集。AOF
文件中的命令全部以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還可以在后台對 AOF 文件
進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小
無持久化:讓數據只在服務器運行時存在。
同時應用 AOF 和 RDB:當 Redis 重啟時, 它會優先使用 AOF 文件來還原數據集, 因為 AOF 文件保存的
數據集通常比 RDB 文件所保存的數據集更完整。
RDB 的優缺點:
優點:RDB 是一個非常緊湊(compact)的文件,它保存了 Redis 在某個時間點上的數據集。 這種文件非
常適合用於進行備份: 比如說,你可以在最近的 24 小時內,每小時備份一次 RDB 文件,並且在每個月的每一
天,也備份一個 RDB 文件。 這樣的話,即使遇上問題,也可以隨時將數據集還原到不同的版本。RDB 非常適
用於災難恢復(disaster recovery):它只有一個文件,並且內容都非常緊湊,可以(在加密后)將它傳送到別的
數據中心,或者亞馬遜 S3 中。RDB 可以最大化 Redis 的性能:父進程在保存 RDB 文件時唯一要做的就是 fork
出一個子進程,然后這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤 I/O 操作。RDB 在
恢復大數據集時的速度比 AOF 的恢復速度要快。
缺點:如果你需要盡量避免在服務器故障時丟失數據,那么 RDB 不適合你。 雖然 Redis 允許你設置不同
的保存點(save point)來控制保存 RDB 文件的頻率, 但是, 因為 RDB 文件需要保存整個數據集的狀態, 所
以它並不是一個輕松的操作。 因此你可能會至少 5 分鍾才保存一次 RDB 文件。 在這種情況下, 一旦發生故
障停機, 你就可能會丟失好幾分鍾的數據。每次保存 RDB 的時候,Redis 都要 fork() 出一個子進程,並由子
進程來進行實際的持久化工作。 在數據集比較龐大時, fork() 可能會非常耗時,造成服務器在某某毫秒內停止
處理客戶端;如果數據集非常巨大,並且 CPU 時間非常緊張的話,那么這種停止時間甚至可能會長達整整一秒。
AOF 的優缺點。
優點:
1、使用 AOF 持久化會讓 Redis 變得非常耐久(much more durable):你可以設置不同的 fsync 策略,比如
無 fsync ,每秒鍾一次 fsync ,或者每次執行寫入命令時 fsync 。 AOF 的默認策略為每秒鍾 fsync 一次,在這種
配置下,Redis 仍然可以保持良好的性能,並且就算發生故障停機,也最多只會丟失一秒鍾的數據( fsync 會在后台
線程執行,所以主線程可以繼續努力地處理命令請求)。AOF 文件是一個只進行追加操作的日志文件(append only
log), 因此對 AOF 文件的寫入不需要進行 seek , 即使日志因為某些原因而包含了未寫入完整的命令(比如寫入
時磁盤已滿,寫入中途停機,等等), redis-check-aof 工具也可以輕易地修復這種問題。
2、Redis 可以在 AOF 文件體積變得過大時,自動地在后台對 AOF 進行重寫: 重寫后的新 AOF 文件包含了
恢復當前數據集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在創建新 AOF 文件的過程中,會
繼續將命令追加到現有的 AOF 文件里面,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。 而一旦新 AOF
文件創建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。
缺點:
對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。根據所使用的 fsync 策略,AOF 的速
度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB
一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間
(latency)。
AOF 在過去曾經發生過這樣的 bug : 因為個別命令的原因,導致 AOF 文件在重新載入時,無法將數據集恢復
成保存時的原樣。 (舉個例子,阻塞命令 BRPOPLPUSH 就曾經引起過這樣的 bug 。) 測試套件里為這種情況添
加了測試: 它們會自動生成隨機的、復雜的數據集, 並通過重新載入這些數據來確保一切正常。 雖然這種 bug 在
AOF 文件中並不常見, 但是對比來說, RDB 幾乎是不可能出現這種 bug 的。
