1:為什么Redis需要持久化族奢?
Redis是內(nèi)存型數(shù)據(jù)庫,一般被用于緩存丹鸿,所以Redis需要將數(shù)據(jù)持久化到硬盤中越走。
2:RDB持久化的原理是什么?
RDB是采用二進(jìn)制壓縮文件的方式將數(shù)據(jù)庫內(nèi)容保存到文件中靠欢。
數(shù)據(jù)庫在啟動(dòng)的時(shí)候會(huì)檢查是否有RDB文件廊敌,然后將其載入數(shù)據(jù)庫。
系統(tǒng)一般有兩種方式來創(chuàng)建RDB文件门怪,即阻塞型和非阻塞型骡澈,其底層都是調(diào)用同一個(gè)函數(shù),但是非阻塞型會(huì)先派生出一個(gè)子進(jìn)程掷空,然后由子進(jìn)程執(zhí)行備份功能肋殴。
RDB文件的創(chuàng)建條件是根據(jù)在制定時(shí)間段內(nèi)執(zhí)行的操作次數(shù):通過三個(gè)數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)該功能囤锉。首先是struct saveparam數(shù)組,該數(shù)組是配置參數(shù)
struct saveparam{
time_t seconds;//時(shí)間段
int changes;//修改次數(shù)
}
然后通過dirty修改計(jì)數(shù)器來記錄服務(wù)器距離上次BGSAVE后對數(shù)據(jù)庫的修改次數(shù)护锤。
以及使用time_t lastsave來記錄上次BGSAVE的時(shí)間點(diǎn)官地。
通過serverCron守護(hù)進(jìn)程來周期檢測是否滿足RBD持久化條件
3:RDB文件格式是什么?
這一部分是RDB持久化的重點(diǎn)蔽豺,首先要知道RDB文件格式:
REDIS|db_version|database|EOF|check_sum
- REDIS是用來標(biāo)識RDB文件
- db_version用來記錄RDB文件的版本號
- database存儲數(shù)據(jù)庫信息
- EOF是用來表示RDB文件的結(jié)尾
- check_sum用于校驗(yàn)区丑,以防止文件被破壞,校驗(yàn)內(nèi)容為前面全部
對于database部分,又分為:
SELECTDB|db_number|key_value_pairs
- SELECTDB用于標(biāo)示即將讀入一個(gè)數(shù)據(jù)庫號碼
- db_number用于標(biāo)示數(shù)據(jù)庫號碼(Redis可以存儲多個(gè)數(shù)據(jù)庫)
- key_value_pairs用于保存數(shù)據(jù)庫的kv值(Redis是鍵值數(shù)據(jù)庫)
其中key_value_pairs格式又分為兩類:
如果帶有過期時(shí)間修陡,則格式為
EXPIRETIME_MS|ms|TYPE|key|value
否則為:
TYPE|key|value
因?yàn)镽edis的key都是字符串編碼沧侥,所以TYPE主要用于標(biāo)示VALUE的編碼,具體的編碼格式參見:《Redis設(shè)計(jì)與實(shí)現(xiàn)》一書魄鸦。