1. 程式人生 > >一文了解:Redis的RDB持久化

一文了解:Redis的RDB持久化

一文了解:Redis的RDB持久化

Redis是記憶體資料庫,為了保證資料不在故障後丟失,Redis需要將資料持久化到硬碟上。

Redis持久化有兩種方式:一種是快照,全量備份。一種是AOF方式,連續增量方式。

RDB

RDB持久化就是把資料生成快照儲存到硬碟的過程。每N分鐘資料傳送了M次寫操作之後,從記憶體dump資料形成rdb檔案,壓縮後放在備份目錄

工作原理

Redis-Server主程序會Fork一個子程序在後臺生成RDB檔案,主程序可以在不阻塞執行緒情況下接收其他命令。在主程序Fork過程中會產生阻塞,Fork完成後不在阻塞主程序,持久化工作交給子程序,子程序會生成一個臨時的快照檔案,完成後會對原有檔案進行替換。

儲存時間點配置

在redis.conf檔案中可以設定每N秒之後M個Key發生了寫操作就儲存快照。

格式為:save <seconds> <changes>

save 900 1          # 900秒之後至少有1個Key發生寫操作
save 300 10         # 300秒之後至少有10個Key發生寫操作
save 60 10000       # 60秒之後至少有10000個Key發生寫操作

先檢查60秒之內是否有1000個寫操作,再檢查300秒之後是否有10個寫操作,最後檢查900秒之後是否有1個寫操作。

如果想要禁用RDB功能可以註釋掉所有的save配置,也可以將save配置改為save ""

檔案

RDB檔案儲存在dir配置的指定目錄下,預設為redis-server啟動目錄,RDB檔案檔名為dbfilename配置,預設為dump.rdb檔名,我們可以更改dir和dbfilename配置修改檔案儲存的路徑和檔名。

dir ./

dbfilename dump.rdb

通過config set dir {newDir} 動態修改dir配置

> config set dir /Users/JAVA/Redis/RDB
OK

通過config set dbfilename {newDbfilename} 動態修改RDB檔名稱

> config set dbfilename backup.rdb
OK

壓縮

RDB檔案預設以LZF演算法壓縮儲存,rdbcompression配置預設為yes,當改為no時表示不壓縮。

rdbcompression yes

通過config set rdbcompression {yes|no} 動態修改是否壓縮

錯誤處理

當快照過程中發生錯誤可以通過stop-writes-on-bgsave-error配置禁止Redis再寫入資料,預設為yes開啟。

stop-writes-on-bgsave-error yes 

通過config set stop-writes-on-bgsave-error {yes|no} 動態修改是否開啟RDB檔案快照過程出錯時禁止寫入資料到Redis

檢驗

在版本5中,為了保證RDB檔案的完整性會在檔案末尾加入一個CRC64的校驗碼。通過rdbchecksum配置是否開啟,如果配置為no則使用0代替CRC64校驗碼,載入RDB檔案時會跳過校驗。

rdbchecksum yes

通過config set rdbchecksum {yes|no} 動態修改是否新增校驗碼

手動觸發命令

save命令

save命令會使用阻塞主程序的方式生成RDB檔案,這意味著生成RDB檔案過程中其他命令將阻塞等待RDB檔案生成完成。所以不建議在生產環境使用。

> save
OK

bgsave和lastsave命令

bgsave命令會使用和自動觸發生成RDB檔案一樣,在後臺fork()一個子程序生成RDB檔案。可以通過lastsave命令檢視是否成功。

> bgsave
Background saving started
> lastsave
(integer) 1565190498

優缺點

優點
  1. 儲存了某個時間點的快照資料,適合做災備
  2. RDB的啟動速度比AOF快

缺點

  1. 沒辦法做到實時持久化,在儲存時間點未到達時故障,容易丟掉最新資料
  2. fork操作會在建立子程序期間阻塞主程序

結語

本人深知水平有限,歡迎指正本文錯誤之處。


歡迎關注我的微信公眾號:bate喵