1:為什么Redis需要持久化?
Redis是內(nèi)存型數(shù)據(jù)庫,一般被用于緩存,所以Redis需要將數(shù)據(jù)持久化到硬盤中。
2:RDB持久化的原理是什么?
RDB是采用二進(jìn)制壓縮文件的方式將數(shù)據(jù)庫內(nèi)容保存到文件中。
數(shù)據(jù)庫在啟動的時候會檢查是否有RDB文件,然后將其載入數(shù)據(jù)庫。
系統(tǒng)一般有兩種方式來創(chuàng)建RDB文件,即阻塞型和非阻塞型,其底層都是調(diào)用同一個函數(shù),但是非阻塞型會先派生出一個子進(jìn)程,然后由子進(jìn)程執(zhí)行備份功能。
RDB文件的創(chuàng)建條件是根據(jù)在制定時間段內(nèi)執(zhí)行的操作次數(shù):通過三個數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)該功能。首先是struct saveparam數(shù)組,該數(shù)組是配置參數(shù)
struct saveparam{
time_t seconds;//時間段
int changes;//修改次數(shù)
}
然后通過dirty修改計(jì)數(shù)器來記錄服務(wù)器距離上次BGSAVE后對數(shù)據(jù)庫的修改次數(shù)。
以及使用time_t lastsave來記錄上次BGSAVE的時間點(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)示即將讀入一個數(shù)據(jù)庫號碼
- db_number用于標(biāo)示數(shù)據(jù)庫號碼(Redis可以存儲多個數(shù)據(jù)庫)
- key_value_pairs用于保存數(shù)據(jù)庫的kv值(Redis是鍵值數(shù)據(jù)庫)
其中key_value_pairs格式又分為兩類:
如果帶有過期時間,則格式為
EXPIRETIME_MS|ms|TYPE|key|value
否則為:
TYPE|key|value
因?yàn)镽edis的key都是字符串編碼,所以TYPE主要用于標(biāo)示VALUE的編碼,具體的編碼格式參見:《Redis設(shè)計(jì)與實(shí)現(xiàn)》一書。