Redis的RDB持久化使用及說明
Redis 的 RDB 持久化,本質(zhì)是通過生成內(nèi)存數(shù)據(jù)的快照文件(.rdb)來保存數(shù)據(jù),Redis 重啟時(shí)加載該文件即可恢復(fù)數(shù)據(jù)。
RDB 是 Redis 默認(rèn)的持久化方式,支持手動觸發(fā)和自動觸發(fā)兩種模式,下面從核心機(jī)制、配置、操作步驟、恢復(fù)流程、優(yōu)缺點(diǎn)等方面,詳細(xì)說明如何使用 RDB 持久化。
一、RDB 持久化的核心原理
快照生成邏輯當(dāng)觸發(fā) RDB 持久化時(shí),Redis 會執(zhí)行以下步驟:
- Redis 主進(jìn)程
fork一個(gè)子進(jìn)程(父子進(jìn)程共享內(nèi)存數(shù)據(jù)); - 子進(jìn)程遍歷內(nèi)存中的數(shù)據(jù),將其寫入到一個(gè)臨時(shí)的 RDB 文件中;
- 子進(jìn)程寫入完成后,用臨時(shí)文件替換舊的 RDB 文件(原子操作,保證文件完整性);
- 子進(jìn)程退出,主進(jìn)程繼續(xù)處理客戶端請求。
關(guān)鍵:fork 操作會產(chǎn)生 ** 寫時(shí)復(fù)制(Copy-On-Write)** 機(jī)制 —— 父子進(jìn)程共享內(nèi)存頁,只有當(dāng)主進(jìn)程修改數(shù)據(jù)時(shí),才會復(fù)制對應(yīng)內(nèi)存頁,避免占用雙倍內(nèi)存。
RDB 文件特性
- 文件名默認(rèn)是
dump.rdb,是二進(jìn)制壓縮文件,體積小,便于傳輸和備份; - 一個(gè) RDB 文件包含某一時(shí)刻 Redis 的全量數(shù)據(jù)快照,恢復(fù)時(shí)直接加載到內(nèi)存,速度遠(yuǎn)快于 AOF 持久化。
二、RDB 持久化的觸發(fā)方式
RDB 有兩種觸發(fā)方式:手動觸發(fā)(按需執(zhí)行)和自動觸發(fā)(配置規(guī)則自動執(zhí)行)。
手動觸發(fā)(常用)
手動觸發(fā)有兩個(gè)命令:SAVE 和 BGSAVE,生產(chǎn)環(huán)境優(yōu)先使用 BGSAVE。
| 命令 | 執(zhí)行邏輯 | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用場景 |
|---|---|---|---|---|
| SAVE | 主進(jìn)程直接生成 RDB 文件,阻塞所有客戶端請求 | 無需 fork 子進(jìn)程,無內(nèi)存開銷 | 阻塞 Redis,期間無法處理命令 | 測試環(huán)境、數(shù)據(jù)量極小的場景 |
| BGSAVE | 主進(jìn)程 fork 子進(jìn)程生成 RDB 文件,主進(jìn)程不阻塞 | 不影響 Redis 正常服務(wù) | fork 子進(jìn)程會消耗內(nèi)存(大內(nèi)存實(shí)例 fork 較慢) | 生產(chǎn)環(huán)境、日常備份 |
實(shí)操示例
# 1. 手動執(zhí)行 BGSAVE(推薦) 127.0.0.1:6379> BGSAVE Background saving started # 提示:后臺保存已啟動 # 2. 查看 BGSAVE 執(zhí)行狀態(tài)(通過 INFO 命令) 127.0.0.1:6379> INFO persistence # Persistence rdb_changes_since_last_save: 0 # 上次保存后數(shù)據(jù)變化量 rdb_bgsave_in_progress: 0 # 0=未執(zhí)行,1=正在執(zhí)行 rdb_last_save_time: 1719234567 # 上次保存的時(shí)間戳 rdb_last_bgsave_status: ok # 上次保存狀態(tài):ok=成功,err=失敗
自動觸發(fā)(配置規(guī)則)
通過修改 redis.conf 配置文件,設(shè)置數(shù)據(jù)變化觸發(fā)條件,Redis 會在滿足條件時(shí)自動執(zhí)行 BGSAVE。
核心配置項(xiàng)是 save <seconds> <changes>,格式為:save 時(shí)間窗口(秒) 數(shù)據(jù)變化次數(shù),可以配置多個(gè)條件(滿足任意一個(gè)即觸發(fā))。
配置示例(redis.conf)
# 900秒內(nèi)至少1個(gè)鍵被修改 → 觸發(fā) BGSAVE save 900 1 # 300秒內(nèi)至少10個(gè)鍵被修改 → 觸發(fā) BGSAVE save 300 10 # 60秒內(nèi)至少10000個(gè)鍵被修改 → 觸發(fā) BGSAVE save 60 10000 # 禁用自動觸發(fā) RDB(注釋所有 save 配置,或添加下面一行) # save ""
其他自動觸發(fā)場景
- 執(zhí)行
FLUSHALL命令:會清空所有數(shù)據(jù),并生成一個(gè)空的dump.rdb文件(生產(chǎn)環(huán)境慎用)。 - 主從復(fù)制時(shí):主節(jié)點(diǎn)首次向從節(jié)點(diǎn)同步數(shù)據(jù)時(shí),會自動執(zhí)行
BGSAVE生成 RDB 文件,發(fā)送給從節(jié)點(diǎn)。
三、RDB 持久化的核心配置(redis.conf)
除了 save 觸發(fā)條件,redis.conf 中還有多個(gè)參數(shù)控制 RDB 的行為,關(guān)鍵配置如下:
| 配置項(xiàng) | 作用 | 默認(rèn)值 | 示例 |
|---|---|---|---|
| dbfilename | 指定 RDB 文件名 | dump.rdb | dbfilename redis_6379.rdb(按端口命名,便于區(qū)分多實(shí)例) |
| dir | 指定 RDB 文件的保存目錄(必須是目錄,不是文件名) | .(當(dāng)前目錄) | dir /var/lib/redis(推薦配置獨(dú)立目錄) |
| rdbcompression | 是否壓縮 RDB 文件(LZF 壓縮算法) | yes | rdbcompression yes(壓縮后文件更小,略增加 CPU 開銷) |
| rdbchecksum | 是否對 RDB 文件做校驗(yàn)和(CRC64 算法),保證文件完整性 | yes | rdbchecksum yes(加載時(shí)校驗(yàn),略增加 CPU 開銷) |
配置生效步驟
修改 redis.conf 后,重啟 Redis 生效:
redis-server /etc/redis/redis.conf
驗(yàn)證配置:
127.0.0.1:6379> CONFIG GET dbfilename 1) "dbfilename" 2) "redis_6379.rdb" 127.0.0.1:6379> CONFIG GET dir 1) "dir" 2) "/var/lib/redis"
四、RDB 持久化的數(shù)據(jù)恢復(fù)流程
Redis 重啟時(shí)會自動加載 RDB 文件恢復(fù)數(shù)據(jù),無需手動操作,恢復(fù)流程如下:
- Redis 啟動時(shí),檢查
dir配置的目錄下是否存在dbfilename指定的 RDB 文件; - 如果存在,加載 RDB 文件到內(nèi)存;如果不存在,啟動后數(shù)據(jù)為空;
- 加載完成后,Redis 開始接受客戶端請求。
注意:如果 Redis 同時(shí)開啟了 AOF 持久化,則會優(yōu)先加載 AOF 文件(因?yàn)?AOF 數(shù)據(jù)的實(shí)時(shí)性更高)。
驗(yàn)證數(shù)據(jù)恢復(fù)
手動執(zhí)行 BGSAVE 生成 RDB 文件:
127.0.0.1:6379> SET name tom # 寫入測試數(shù)據(jù) OK 127.0.0.1:6379> BGSAVE Background saving started
停止 Redis:
redis-cli shutdown
重啟 Redis,查看數(shù)據(jù)是否恢復(fù):
redis-cli 127.0.0.1:6379> GET name "tom" # 數(shù)據(jù)成功恢復(fù)
五、RDB 持久化的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 恢復(fù)速度快:RDB 是全量快照文件,Redis 重啟時(shí)直接加載到內(nèi)存,比 AOF 逐行重放命令快得多。
- 文件體積小:二進(jìn)制壓縮格式,便于備份、歸檔和傳輸(適合用于定時(shí)備份)。
- 對主進(jìn)程影響小:
BGSAVE由子進(jìn)程執(zhí)行,主進(jìn)程可以正常處理請求。
缺點(diǎn)
- 數(shù)據(jù)安全性低:RDB 是周期性快照,兩次快照之間的數(shù)據(jù)會丟失(比如設(shè)置
save 900 1,如果 Redis 崩潰,最多會丟失 15 分鐘的數(shù)據(jù))。 - 大內(nèi)存實(shí)例開銷大:
fork子進(jìn)程時(shí),會復(fù)制主進(jìn)程的內(nèi)存頁表,大內(nèi)存實(shí)例(如 10GB 以上)fork耗時(shí)較長,期間 Redis 可能出現(xiàn)短暫卡頓。 - 無法實(shí)時(shí)持久化:不適合對數(shù)據(jù)實(shí)時(shí)性要求高的場景(如金融交易)。
六、RDB 持久化的最佳實(shí)踐(生產(chǎn)環(huán)境)
- 配合 AOF 使用:開啟 RDB+AOF 混合持久化(Redis 4.0+ 支持),兼顧 RDB 的恢復(fù)速度和 AOF 的數(shù)據(jù)安全性。
- 合理配置
save參數(shù):避免過于頻繁觸發(fā)BGSAVE(如不要設(shè)置save 10 1),防止fork操作頻繁消耗資源;也不要設(shè)置太寬松(如save 3600 1),避免數(shù)據(jù)丟失過多。 - 定期手動備份 RDB 文件:通過
BGSAVE生成 RDB 文件后,復(fù)制到其他服務(wù)器或云存儲(如 S3),作為災(zāi)難恢復(fù)的備份。 - 控制 Redis 內(nèi)存大小:避免 Redis 內(nèi)存過大(如超過 10GB),減少
fork時(shí)的內(nèi)存開銷和卡頓時(shí)間。 - 監(jiān)控
fork耗時(shí):通過INFO stats查看latest_fork_usec(上次fork耗時(shí),單位微秒),如果耗時(shí)過長(如超過 1 秒),需要優(yōu)化內(nèi)存或調(diào)整持久化策略。
總結(jié)
RDB 持久化是 Redis 的基礎(chǔ)持久化方式,核心是通過快照文件保存全量數(shù)據(jù),使用時(shí)需注意:
- 手動觸發(fā)用
BGSAVE,避免SAVE阻塞主進(jìn)程; - 自動觸發(fā)通過
redis.conf的save參數(shù)配置,平衡性能和數(shù)據(jù)安全性; - 恢復(fù)時(shí) Redis 自動加載 RDB 文件,AOF 開啟時(shí)優(yōu)先加載 AOF;
- 生產(chǎn)環(huán)境建議 RDB+AOF 混合持久化,兼顧速度和安全性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis批量刪除namespace下的數(shù)據(jù)的實(shí)現(xiàn)步驟
在開發(fā)中為了更好的管理數(shù)據(jù),對redis進(jìn)行了分組存儲操作,在存值時(shí)加了命名空間來實(shí)現(xiàn),本文就來介紹一下redis批量刪除namespace下的數(shù)據(jù)的實(shí)現(xiàn)步驟,感興趣的可以了解一下2025-12-12
Redis鍵值設(shè)計(jì)的具體實(shí)現(xiàn)
本文主要介紹了Redis鍵值設(shè)計(jì)的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
在Centos?8.0中安裝Redis服務(wù)器的教程詳解
由于考慮到linux服務(wù)器的性能,所以經(jīng)常需要把一些中間件安裝在linux服務(wù)上,今天通過本文給大家介紹下在Centos?8.0中安裝Redis服務(wù)器的詳細(xì)過程,感興趣的朋友一起看看吧2022-03-03
redislive監(jiān)控redis服務(wù)的圖文教程_動力節(jié)點(diǎn)Java 學(xué)院整理
這篇文章主要介紹了redislive監(jiān)控redis服務(wù)的圖文教程_動力節(jié)點(diǎn)Java 學(xué)院整理,需要的朋友可以參考下2017-08-08
淺談我是如何用redis做實(shí)時(shí)訂閱推送的
這篇文章主要介紹了淺談我是如何用redis做實(shí)時(shí)訂閱推送的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

