Redis 7持久化RDB和AOF的原理機(jī)制講解(圖文教程)
1.概述
Redis是一個(gè)基于內(nèi)存的數(shù)據(jù)庫(kù),這意味著其主要數(shù)據(jù)存儲(chǔ)和操作均在內(nèi)存中進(jìn)行。這種設(shè)計(jì)使得Redis能夠提供極快的讀寫速度(通常達(dá)到微秒級(jí)別),適用于高性能場(chǎng)景,如緩存
- 然而,由于內(nèi)存的易失性(斷電后數(shù)據(jù)會(huì)丟失),Redis提供了
持久化機(jī)制:將內(nèi)存中的數(shù)據(jù)保存到磁盤中,確保數(shù)據(jù)在Redis服務(wù)重啟或崩潰后能夠恢復(fù)。通過持久化,可以避免數(shù)據(jù)丟失,提高數(shù)據(jù)的可靠性 - Redis提供兩種持久化方式
- RDB(Redis Database):生成數(shù)據(jù)集的快照實(shí)現(xiàn)持久化
- AOF(Append Only File):記錄所有寫操作命令,以追加方式寫入文件
2.RDB
RDB指的是Redis的一種持久化機(jī)制,其核心是生成Redis數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照
2.1 快照原理
由于Redis是單線程應(yīng)用程序,在線上環(huán)境時(shí),不僅要處理來(lái)自客戶端的請(qǐng)求,還要執(zhí)行內(nèi)存快照操作(進(jìn)行文件IO)。單線程同時(shí)處理客戶端請(qǐng)求和文件IO時(shí)會(huì)嚴(yán)重降低服務(wù)器性能,甚至阻塞客戶端請(qǐng)求。因此,Redis使用 fork 和 寫實(shí)拷貝(Copy On Write) 機(jī)制來(lái)實(shí)現(xiàn)快照持久化
fork
Redis在進(jìn)行RDB持久化時(shí)會(huì)調(diào)用fork函數(shù)來(lái)創(chuàng)建一個(gè)子進(jìn)程負(fù)責(zé)完成,父進(jìn)程則繼續(xù)處理客戶端請(qǐng)求。子進(jìn)程在創(chuàng)建之初和父進(jìn)程共享同一數(shù)據(jù)段
Linux操作系統(tǒng)的內(nèi)存空間被分為很多種片段,每個(gè)片段又被分為很多個(gè)頁(yè)面,每個(gè)頁(yè)面4KB
寫實(shí)拷貝
當(dāng)父進(jìn)程對(duì)數(shù)據(jù)段中的某一數(shù)據(jù)頁(yè)面進(jìn)行修改操作時(shí),Linux操作系統(tǒng)會(huì)將該數(shù)據(jù)頁(yè)面復(fù)制一份分離出來(lái),然后對(duì)該頁(yè)面進(jìn)行修改,最后父進(jìn)程指向指向修改后的頁(yè)面。隨著被修改的頁(yè)面越來(lái)越多,內(nèi)存空間不斷膨脹,最多達(dá)到原來(lái)的兩倍
從子進(jìn)程被創(chuàng)建出來(lái)的那一刻起,直至拷貝結(jié)束,子進(jìn)程始終指向原始的數(shù)據(jù)段且所有原數(shù)據(jù)段不會(huì)被修改。所以,在整個(gè)拷貝過程中 RDB快照 = 子進(jìn)程看到的所有數(shù)據(jù)頁(yè)面的瞬間狀態(tài)集合
拷貝完成后,子進(jìn)程會(huì)被銷毀,同時(shí)沒有指針指向的數(shù)據(jù)頁(yè)面也會(huì)被銷毀
2.2 觸發(fā)機(jī)制
Redis RDB的觸發(fā)機(jī)制分為自動(dòng)觸發(fā)和手動(dòng)觸發(fā)兩種方式
- 自動(dòng)觸發(fā)
- 在redis.conf中通過save指令配置閾值。當(dāng)在指定時(shí)間內(nèi)發(fā)生足夠數(shù)量的鍵修改時(shí)自動(dòng)觸發(fā)bgsave

- 正常關(guān)閉Redis
# 默認(rèn)執(zhí)行save(阻塞式) > shutdown # 或 > shutdown save # 觸發(fā)流程: 1. 停止接受新連接 2. 執(zhí)行save(不是bgsave) 3. 保存完成后退出
- 在redis.conf中通過save指令配置閾值。當(dāng)在指定時(shí)間內(nèi)發(fā)生足夠數(shù)量的鍵修改時(shí)自動(dòng)觸發(fā)bgsave
- 手動(dòng)觸發(fā)
- save命令:同步阻塞式觸發(fā),執(zhí)行期間Redis服務(wù)器不處理任何請(qǐng)求,直到RDB文件創(chuàng)建完成(不推薦)
- bgsave命令:異步非阻塞式觸發(fā),Redis會(huì)fork一個(gè)子進(jìn)程執(zhí)行持久化操作,主進(jìn)程繼續(xù)處理請(qǐng)求
2.3 文件處理
RDB文件保存在dir配置指定的目錄下(默認(rèn)/var/lib/redis),文件名通過dbfilename配置指定(默認(rèn)dump.sql)
在RDB備份過程中,fork出的子進(jìn)程會(huì)將內(nèi)存數(shù)據(jù)寫入臨時(shí)文件,臨時(shí)文件默認(rèn)命名規(guī)則為temp-< pid >.rdb,其中< pid >是子進(jìn)程的進(jìn)程ID。當(dāng)子進(jìn)程完成RDB文件寫入后,Redis會(huì)用原子性的rename操作將臨時(shí)文件重命名為正式RDB文件并刪除原文件
2.4 優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 恢復(fù)速度快:RDB是數(shù)據(jù)的二進(jìn)制快照,恢復(fù)時(shí)直接加載到內(nèi)存
- 備份時(shí)對(duì)服務(wù)影響小:使用bgsave命令時(shí),Redis通過fork子進(jìn)程在后臺(tái)保存數(shù)據(jù),主進(jìn)程可以繼續(xù)處理客戶端請(qǐng)求,幾乎無(wú)阻塞
- 存儲(chǔ)高效:RDB 文件使用二進(jìn)制格式并支持LZF壓縮
缺點(diǎn)
- 非實(shí)時(shí)一致性:RDB保存的是某個(gè)瞬間的快照,如果保存過程中有大量寫入,快照可能不反映完全一致的業(yè)務(wù)狀態(tài)
- 可能丟失更多數(shù)據(jù):如果Redis意外宕機(jī),從上一次RDB保存到宕機(jī)之間的所有數(shù)據(jù)修改都會(huì)丟失
3.AOF
AOF持久化通過將Redis服務(wù)器接收到的每個(gè)寫命令追加到文件末尾來(lái)實(shí)現(xiàn)
# 開啟AOF appendonly yes
3.1 工作流程

- 命令追加:當(dāng)Redis執(zhí)行寫命令時(shí),該命令會(huì)以Redis協(xié)議格式追加到內(nèi)存中的AOF緩沖區(qū)(aof_buf)。緩沖區(qū)會(huì)根據(jù)配置策略決定何時(shí)將內(nèi)容同步到磁盤
- 文件寫入與同步:AOF緩沖區(qū)內(nèi)容會(huì)被寫入到AOF文件,具體同步到磁盤的時(shí)機(jī)由appendfsync參數(shù)控制:

- always:每次寫命令后同步,數(shù)據(jù)安全性最高但性能影響較大
- everysec:每秒同步一次,平衡性能與安全性(默認(rèn)配置)
- no:由操作系統(tǒng)決定同步時(shí)機(jī),性能最好但可能丟失較多數(shù)據(jù)
3.2 重寫機(jī)制
作用:解決AOF文件不斷增長(zhǎng)導(dǎo)致的存儲(chǔ)空間占用和恢復(fù)效率問題。通過重寫,可以生成一個(gè)更緊湊的AOF文件,僅包含重建當(dāng)前數(shù)據(jù)集所需的最小命令集合(例如,對(duì)同一個(gè)鍵多次修改會(huì)記錄多條命令,而重寫機(jī)制會(huì)合并這些操作,僅保留最終狀態(tài)的命令)
父進(jìn)程通過fork創(chuàng)建一個(gè)子進(jìn)程來(lái)完成AOF文件的重寫,確保主進(jìn)程繼續(xù)處理客戶端請(qǐng)求。子進(jìn)程會(huì)讀取當(dāng)前數(shù)據(jù)庫(kù)的快照數(shù)據(jù),并將其轉(zhuǎn)換為一系列Redis命令寫入新的臨時(shí)AOF文件
在重寫過程中,主進(jìn)程會(huì)將新接收到的寫命令同時(shí)寫入現(xiàn)有的AOF 緩沖區(qū)aof_buf(保證原有 AOF 文件正常更新)和AOF重寫緩沖區(qū)aof_rewrite_buf(保證新命令不會(huì)丟失)
當(dāng)子進(jìn)程完成重寫后,會(huì)通知主進(jìn)程。主進(jìn)程會(huì)將 AOF 重寫緩沖區(qū)中的命令追加到新生成的臨時(shí) AOF 文件中,最后原子性地替換舊文件
在Redis7.0.15版本,AOF文件保存在dir + appenddirname配置指定的目錄下(默認(rèn)/var/lib/redis/appendonlydir)。文件前綴名通過appendfilename配置指定(默認(rèn)appendonly)
- appendonly.aof.1.base.rdb:作為Redis AOF(Append-Only File)持久化機(jī)制的基準(zhǔn)文件,存儲(chǔ)某一時(shí)刻數(shù)據(jù)庫(kù)的完整快照。格式為RDB,體積較小且加載速度快,用于重建數(shù)據(jù)的基礎(chǔ)狀態(tài)
- appendonly.aof.1.incr.aof和appendonly.aof.2.incr.aof:記錄基準(zhǔn)文件生成后的增量寫操作命令,以文本形式追加存儲(chǔ)。多個(gè)增量文件按操作順序編號(hào)(如
.1.incr.aof、.2.incr.aof),Redis 重啟時(shí)會(huì)按順序重放這些命令以恢復(fù)最新數(shù)據(jù) - appendonly.aof.manifest:描述AOF文件的組成和順序的清單文件

4.混合持久化
Redis 混合持久化結(jié)合了 RDB(快照)和 AOF(日志)兩種持久化方式的優(yōu)勢(shì),在保證數(shù)據(jù)安全性的同時(shí)兼顧性能
# 開啟混合持久化 aof-use-rdb-preamble yes
- 基礎(chǔ)RDB文件優(yōu)先加載:appendonly.aof.1.base.rdb作為全量快照數(shù)據(jù)文件,會(huì)優(yōu)先被加載。該文件包含某一時(shí)間點(diǎn)的完整數(shù)據(jù)快照,恢復(fù)時(shí)作為基準(zhǔn)數(shù)據(jù)集
- 增量AOF文件后續(xù)應(yīng)用:appendonly.aof.1.incr.aof作為增量操作日志,在基礎(chǔ)RDB加載完成后被重放。該文件記錄自 RDB 快照生成后的所有寫操作,用于恢復(fù)最新數(shù)據(jù)狀態(tài)
到此這篇關(guān)于Redis 7持久化RDB和AOF的原理機(jī)制講解(圖文教程)的文章就介紹到這了,更多相關(guān)Redis持久化RDB和AOF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Redis?zSet實(shí)現(xiàn)滑動(dòng)窗口對(duì)短信進(jìn)行防刷限流的問題
這篇文章主要介紹了基于Redis?zSet實(shí)現(xiàn)滑動(dòng)窗口對(duì)短信進(jìn)行防刷限流,主要針對(duì)目前線上短信被腳本惡意盜刷的情況,用Redis實(shí)現(xiàn)滑動(dòng)窗口限流,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-02-02
redis中使用bloomfilter的白名單功能解決緩存穿透問題
本文主要介紹了redis中使用bloomfilter的白名單功能解決緩存穿透問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

