# Redis中RDB技術的底層原理是什么
## 一、RDB技術概述
### 1.1 什么是RDB
RDB(Redis Database)是Redis默認的持久化方案,它通過生成數據快照(snapshot)的方式將內存中的數據保存到磁盤中。RDB文件是一個經過壓縮的二進制文件,包含了Redis在某個時間點的完整數據狀態。
### 1.2 RDB與AOF的對比
| 特性 | RDB | AOF |
|------------|----------------------|----------------------|
| 持久化方式 | 定時快照 | 記錄每次寫操作 |
| 文件大小 | 較?。ǘM制壓縮) | 較大(文本命令累積) |
| 恢復速度 | 更快 | 較慢 |
| 數據安全性 | 可能丟失最后一次快照 | 最多丟失1秒數據 |
| 性能影響 | 保存時性能波動 | 持續寫入性能穩定 |
## 二、RDB核心實現原理
### 2.1 數據保存流程
```c
// Redis核心源碼片段(rdb.c)
int rdbSave(char *filename) {
// 1. 創建臨時文件
FILE *fp = fopen(tmpfile,"w");
// 2. 初始化IO上下文
rio rdb;
rioInitWithFile(&rdb,fp);
// 3. 寫入RDB頭部信息
rdbWriteRaw(&rdb,"REDIS0006",9);
// 4. 遍歷數據庫保存鍵值對
for (j = 0; j < server.dbnum; j++) {
// 寫入DB選擇器
rdbSaveType(&rdb,RDB_OPCODE_SELECTDB);
rdbSaveLen(&rdb,j);
// 保存鍵值對
dict *d = server.db[j].dict;
dictIterator *di = dictGetIterator(d);
while((de = dictNext(di)) != NULL) {
sds keystr = dictGetKey(de);
robj *valobj = dictGetVal(de);
// 序列化鍵值對
rdbSaveKeyValuePair(&rdb,keystr,valobj,expiretime);
}
}
// 5. 寫入EOF結束符和校驗和
rdbSaveType(&rdb,RDB_OPCODE_EOF);
rdbSaveLen(&rdb,crc64(0,rdb.buffer,rdb.buffered));
// 6. 原子性重命名文件
rename(tmpfile,filename);
}
save 900 1 # 900秒內至少1個key變化
save 300 10 # 300秒內至少10個key變化
save 60 10000 # 60秒內至少10000個key變化
shutdown命令:正常關閉時自動執行RDB保存
主從復制:從節點全量同步時會觸發主節點執行BGSAVE
SAVE
:同步保存,阻塞主線程BGSAVE
:后臺保存,fork子進程處理// 偽代碼表示BGSAVE過程
void bgsave() {
pid_t pid = fork();
if (pid == 0) {
// 子進程
rdbSave("dump.rdb");
exit(0);
} else {
// 父進程繼續處理請求
}
}
save
閾值減少fork頻率+---------------------+
| "REDIS" magic | # 5字節魔術字
| RDB版本號 | # 4字節版本號
|---------------------|
| 數據庫0數據 |
| - SELECTDB opcode |
| - DB number |
| - 鍵值對列表 |
| - EXPIRETIME_MS | # 可選
| - TYPE |
| - KEY |
| - VALUE |
|---------------------|
| 數據庫N數據 |
|---------------------|
| EOF標記 |
| CRC64校驗和 |
+---------------------+
類型 | 編碼值 | 存儲格式 |
---|---|---|
STRING | 0 | 長度前綴+原始數據 |
LIST | 1 | 元素數量+連續元素 |
SET | 2 | 元素數量+連續元素 |
ZSET | 3 | 成員-分值對列表 |
HASH | 4 | 字段-值對列表 |
# 禁用不必要的保存規則
save ""
# 調整自動保存閾值
save 3600 1
# 提高子進程優先級
rdbcompression yes
rdbchecksum yes
# 查看持久化狀態
redis-cli info persistence
# 關鍵指標
rdb_last_save_time # 上次成功保存時間
rdb_changes_since_save # 自上次保存后的修改量
rdb_last_bgsave_status # 上次BGSAVE狀態
本文基于Redis 6.2版本分析,實際實現可能隨版本演進有所變化。建議讀者結合源碼(src/rdb.c)和官方文檔進行深入理解。 “`
注:由于篇幅限制,本文實際約2500字。如需擴展到3500字,可以增加以下內容: 1. 更詳細的性能測試數據 2. 具體故障案例分析 3. 與其他數據庫快照技術的橫向對比 4. 源碼級別的深度解析 5. 生產環境調優實戰經驗
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。