新聞中心
Redis 有兩種持久化方案,RDB (Redis DataBase)和 AOF (Append Only File),本篇文章重點為大家講解一下Redis RDB 持久化方式。

網站建設哪家好,找成都創(chuàng)新互聯!專注于網頁設計、網站建設、微信開發(fā)、成都小程序開發(fā)、集團企業(yè)網站建設等服務項目。為回饋新老客戶創(chuàng)新互聯還提供了蔚縣免費建站歡迎大家使用!
RDB 持久化
RDB 持久化既可以手動執(zhí)行,也可以根據服務器配置選項定期執(zhí)行,該功能可以將某個時間點上的數據庫狀態(tài)保存到一個 RDB 文件中 RDB 持久化功能所生成的 RDB 文件是一個經過壓縮的二進制文件,通過該文件可以還原生成 RDB 文件時的數據庫狀態(tài)
RDB 文件的創(chuàng)建與載入
有兩個 Redis 命令可以用于生成 RDB 文件,一個是 SAVE,另一個是 BGSAVE SAVE 命令會阻塞 Redis 服務器進程,直到 RDB 文件創(chuàng)建完畢為止,在服務器進程阻塞期間,服務器不能處理任何命令請求
BGSAVE 命令會派生出一個子進程,然后由子進程負責創(chuàng)建 RDB 文件,父進程繼續(xù)處理命令請求
RDB 文件的載入工作是在服務啟動時自動執(zhí)行的,所以 Redis 并沒有專門用于載入 RDB 文件的命令,只要 Redis 服務器在啟動時檢測到 RDB 文件存在,它就會自動載入 RDB 文件
因為 AOF 文件的更新頻率通常比 RDB 文件的更新頻率高,所以如果服務器開啟了 AOF 持久化功能,那么服務器會優(yōu)先使用 AOF 文件來還原數據庫狀態(tài) 只有在 AOF 持久化功能處于關閉狀態(tài)時,服務器才會使用 RDB 文件來還原數據庫狀態(tài)
SAVE 命令執(zhí)行時的服務器狀態(tài):
當 SAVE 命令執(zhí)行時,Redis 服務器會被阻塞,所以當 SAVE 命令正在執(zhí)行時,客戶端發(fā)送的所有命令請求都會被拒絕
只有在服務器執(zhí)行完 SAVE 命令、重新開始接受命令請求之后,客戶端發(fā)送的命令才會被處理
BGSAVE 命令執(zhí)行時的服務器狀態(tài):
子進程創(chuàng)建 RDB 文件的過程中,Redis 服務器仍然可以繼續(xù)處理客戶端的命令請求,但是,在 BGSAVE 命令執(zhí)行期間,服務器處理 SAVE、BGSAVE、BGREWRITEAOF 三個命令的方式會和平時有所不同
首先,在 BGSAVE 命令執(zhí)行期間,客戶端發(fā)送的 SAVE 命令會被服務器拒絕,服務器禁止 SAVE 命令和 BGSAVE 命令同時執(zhí)行是為了避免父進程和子進程同時執(zhí)行兩個 rdbSave 調用,防止產生競爭條件
其次,在 BGSAVE 命令執(zhí)行期間,客戶端發(fā)送的 BGSAVE 命令會被服務器拒絕,因為同時執(zhí)行兩個 BGSAVE 命令也會產生競爭條件
最后,BGREWRITEAOF 和 BGSAVE 兩個命令不能同時執(zhí)行
如果 BGSAVE 命令正在執(zhí)行,那么客戶端發(fā)送的 BGREWRITEAOF 命令會被延遲到 BGSAVE 命令執(zhí)行完畢之后執(zhí)行
如果 BGREWRITEAOF 命令正在執(zhí)行,那么客戶端發(fā)送的 BGSAVE 命令會被服務器拒絕
因為 BGREWRITEAOF 和 BGSAVE 兩個命令的實際工作都由子進程執(zhí)行,所以這兩個命令在操作方面并沒有什么沖突的地方,不能同時執(zhí)行它們只是一個性能方面的考慮一一并發(fā)出兩個子進程,并且這兩個子進程都同時執(zhí)行大量的磁盤寫入操作
RDB 文件載入時的服務器狀態(tài): 服務器在載入RDB 文件期間,會一直處于阻塞狀態(tài),直到載入工作完成為止
自動間隔性保存
因為 BGSAVE 命令可以在不阻塞服務器進程的情況下執(zhí)行,所以 Redis 允許用戶通過設置服務器配置的 save 選項,讓服務器每隔一段時間自動執(zhí)行一次 BGSAVE 命令
用戶可以通過 save 選項設置多個保存條件,但只要其中任意一個條件被滿足,服務器就會執(zhí)行 BGSAVE 命令 舉個例子,如果我們向服務器提供以下配置:
save 900 1
save 300 10
save 60 10000
那么只要滿足以下三個條件中的任意一個,BGSAVE 命令就會被執(zhí)行:
服務器在 900 秒之內,對數據庫進行了至少 1 次修改
服務器在 300 秒之內,對數據庫進行了至少 10 次修改
服務器在 60 秒之內,對數據庫進行了至少 10000 次修改
設置保存條件
通過設置 Redis 服務器配置的 save 選項,可以讓服務器每隔一段時間自動執(zhí)行一次 BGSAVE 命令;可以配置多個規(guī)則,只要滿足其中一個規(guī)則就執(zhí)行
服務器程序會根據 save 選項設置服務器狀態(tài) redisServer 結構的 saveparams 屬性
saveparams 屬性是一個數組,數組中每個元素都是一個 saveparam 結構:
默認的保存條件數據結構如下:
dirty 計數器和 lastsave 屬性
服務器狀態(tài)還維護著一個 dirty 計數器,以及一個 lastsave 屬性:
dirty 計數器記錄距離上一次成功執(zhí)行 SAVE 命令或者 BGSAVE 命令之后,服務器對數據庫狀態(tài)進行了多少次修改(包括寫入、刪除、更新等操作)
lastsave 屬性是一個 UNIX 時間戳,記錄了服務器上一次成功執(zhí)行 SAVE 命令或者 BGSAVE 命令的時間
當服務器成功執(zhí)行一個數據庫修改命令之后,程序就會對 dirty 計數器進行更新:命令修改了多少次數據庫 dirty 計數器的值就增加多少
檢查保存條件是否滿足
Redis 的服務器周期性操作函數 serverCron 默認每隔 100 毫秒就會執(zhí)行一次,該函數用于對正在運行的服務器進行維護,它的其中一項工作就是檢查 save 選項所設置的保存條件是否已經滿足,如果滿足的話,就執(zhí)行 BGSAVE 命令
算法實現: 遍歷并檢查 saveparams 數組中所有的保存條件,逐一與服務器狀態(tài)的 dirty 屬性和 lastsave 屬性進行比較,只要有任意一個條件滿足就執(zhí)行 BGSAVE 命令
分享題目:RedisRDB持久化方式
鏈接地址:http://m.5511xx.com/article/coeecih.html


咨詢
建站咨詢
