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

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


咨詢
建站咨詢
