Redis
支持RDB
和AOF
兩種持久化機制,持久化功能有效地避免因進程退出形成的數據丟失問題,當下次重啓時利用以前持久化的文件便可實現數據恢復.掌握持久化機制對於學習Redis
很是重要.
RDB
持久化是把當前進程數據生成快照保存到硬盤的過程,出發RDB
持久化過程分發手動觸發和自動觸發redis
手動觸發分別對應save
和bgsave
命令:算法
save
命令:阻塞當前Redis
服務器,直到RDB
過程完成爲止,對於內存比較大的實例會形成長時間阻塞,線上環境不建議使用.運行save
命令對應的Redis
日誌是:* DB saved on disk
bgsave
命令:Redis
進程執行fork
操做建立子進程,RDB
持久化過程由子進程負責,完成後自動結束.阻塞只發生在fork
階段,通常時間很短.運行bgsave
命令對應的Redis
日誌以下:* Background saving started by pid 3177 * DB saved on disk * RDB: 0MB of memory used by copy-on-write * Background saving terminated with success
顯然bgsave
命令是針對save
阻塞問題作的優化版本.所以Redis
內部全部的涉及RDB
的操做都採用bgsave
的方式,而save
命令已經廢棄.服務器
除了執行命令手動觸發以外,Redis
內部還存在自動觸發RDB
的持久化機制,例如如下場景:併發
save
相關配置,如save a b
.表示a秒內數據集存在b次修改後,自動觸發bgsave
.bgsave
生成RDB
文件併發送給從節點.debug reload
命令從新加載Redis
時,也會自動觸發save
操做.shutdown
命令時,若是沒有開啓AOF
持久化功能則自動執行bgsave
.bgsave
是主流的出發RDB
持久化方式,下圖說明了它的運做流程.工具
bgsave
命令,Redis
父進程判斷當前是否存在正在執行的RDB/AOF
子進程,存在直接返回不存在進行下一步.fork
操做建立子進程,fork
操做過程當中父進程會阻塞,經過info stats
命令查看latest_fork_usec
選項,能夠獲取最近一個fork
操做的耗時,單位爲毫秒.fork
完成後,bgsave
命令返回Background saving started
信息並阻塞父進程,能夠繼續相應其餘命令.RDB文件
,根據父進程內存生成臨時快照文件,完成後對原有文件進行原子替換.執行lastsave
命令能夠獲取最後一次生成RDB
的時間,對應info
統計的rdb_last_save_time
選項.info Persistence
下的rdb_*
相關選項.保存:RDB
文件保存在dir
配置指定的目錄下,文件名經過dbfilename
配置指定.能夠經過config dir [newDir]
和config dbfilename [newFileName]
容許期動態執行,當下次運行時RDB
文件會保存到對應的新目錄.
壓縮:Redis
默認採用LZF
算法對生成的RDB
文件作壓縮處理,壓縮後的文件遠遠小於內存大小,默認開啓,能夠經過參數config set rdbcompression {yes|no}
動態修改.
校驗:若是Redis
加載損壞的RDB
文件時拒絕啓動,並打印以下日誌:學習
# Short read or OOM loading DB. Unrecoverable error, aborting now.
這是可使用Redis
提供的redis-check-dump
工具檢測RDB
文件並獲取對應的錯誤報告.優化
RDB
的優勢:spa
RDB
是一個緊湊壓縮的二進制文件,表明Redis
在某個時間點上的數據快照.很是適用於備份,全量複製等場景.好比每6個小時執行bgsave
備份,並把RDB
文件拷貝到遠程機器或文件系統中(如:hdfs
)用於災難恢復.Redis
加載RDB
恢復數據速度遠快於AOF
的方式.RDB
的缺點:線程
RDB
方式數據沒辦法作到實時持久化/秒級持久化.由於bgsave
每次運行都要執行bgsave
每次運行都要執行fork
操做建立子進程,屬於重量級的操做,頻繁操做的成本過高.RDB
文件使用特定的二進制格式保存,Redis
版本演進過程當中有多個格式的RDB
版本,存在老版本Redis
服務沒法兼容新版RDB
格式的問題.