Redis自身提供了兩種持久化方式,分別是RDB快照方式和AOF(Append-only file)方式。redis
RDB方式: RDB持久性以指定的時間間隔執行數據集的時間點快照安全
RDB的優勢:服務器
- RDB很是適合備份,能夠在發生災難的時候輕鬆恢復不一樣版本的數據。
- RDB適合備份,能夠複製文件
- 提升了性能,主進程不須要I/O操做
- 和AOP比啓動更快
RDB的缺點:性能
- 若是數據的完整性要求較高,RDB就不適合
- RDB在執行備份的時候會fork一個線程,若是數據集很大會很費時,可能會致使redis服務在幾毫秒內中止服務。
RDB運行的流程線程
- 當須要執行快照的時候,redis會fork一個子線程
- 子線程會將數據寫到臨時的RDB文件中去
- 當臨時的RDB文件寫完以後會替換原來的RDB文件
AOF方式: AOF方式會記錄服務器接收到的每一個寫入操做,這些操做將在服務器啓動時再次播放,重建原始數據集。使用與Redis協議自己相同的格式以附加方式記錄命令日誌
AOF的優點:進程
- 數據安全性更高,能夠設置每一個操做都進行追加日誌,也能夠1秒鐘進行一次,數據丟失的少
- 因爲AOF只追加日誌,若是宕機或者停電數據不會發生損壞。甚至一個命令寫到一半掛掉了,也可使用redis-check-aof命令進行修復。
- 當日志變得太大的時候,能夠在後臺進行自動重寫。重寫是徹底安全的,由於在Redis繼續附加到舊文件時,會建立一個全新的文件,並建立當前數據集所需的最少操做集,一旦準備好第二個文件,Redis將切換兩個文件並開始追加到新的那一個。
- AOP就是將一個接一個的操做記錄到日誌中去。即便使用flushall命令刪除了全部數據,只要沒有進行重寫操做,只須要中止服務,刪除flushall命令。從新啓動redis就能夠恢復數據。
AOF的缺點:內存
- 文件體積比相同數據的RDB文件要大
- AOF方式持久化會比RDB更耗費服務器資源
AOF執行的流程資源
- Redis進行fork操做,如今就有了一個子線程一個父線程
- 子線程開始在臨時文件中寫入操做
- 父線程繼續提供服務,會將數據更改放入內存緩衝區,同時會繼續寫到舊的文件中去
- 若是子線程寫入完成,父線程會將緩衝區的數據寫入新文件
- 從新命名舊文件,並將新數據附加到新文件中