最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis 7持久化RDB和AOF的原理機(jī)制講解(圖文教程)

 更新時(shí)間:2026年01月02日 09:56:56   作者:九轉(zhuǎn)蒼翎  
Redis是一個(gè)基于內(nèi)存的數(shù)據(jù)庫(kù),由于內(nèi)存的易失性(斷電后數(shù)據(jù)會(huì)丟失),Redis提供了持久化機(jī)制:將內(nèi)存中的數(shù)據(jù)保存到磁盤中,確保數(shù)據(jù)在Redis服務(wù)重啟或崩潰后能夠恢復(fù),通過(guò)持久化,可以避免數(shù)據(jù)丟失,提高數(shù)據(jù)的可靠性,Redis提供兩種持久化方式:RDB和AOF

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ù)。通過(guò)持久化,可以避免數(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è)拷貝過(guò)程中 RDB快照 = 子進(jìn)程看到的所有數(shù)據(jù)頁(yè)面的瞬間狀態(tài)集合

        拷貝完成后,子進(jìn)程會(huì)被銷毀,同時(shí)沒(méi)有指針指向的數(shù)據(jù)頁(yè)面也會(huì)被銷毀

2.2 觸發(fā)機(jī)制

Redis RDB的觸發(fā)機(jī)制分為自動(dòng)觸發(fā)和手動(dòng)觸發(fā)兩種方式

  • 自動(dòng)觸發(fā)
    • 在redis.conf中通過(guò)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. 保存完成后退出
      
  • 手動(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),文件名通過(guò)dbfilename配置指定(默認(rèn)dump.sql)
        在RDB備份過(guò)程中,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通過(guò)fork子進(jìn)程在后臺(tái)保存數(shù)據(jù),主進(jìn)程可以繼續(xù)處理客戶端請(qǐng)求,幾乎無(wú)阻塞
  • 存儲(chǔ)高效:RDB 文件使用二進(jìn)制格式并支持LZF壓縮

缺點(diǎn)

  • 非實(shí)時(shí)一致性:RDB保存的是某個(gè)瞬間的快照,如果保存過(guò)程中有大量寫入,快照可能不反映完全一致的業(yè)務(wù)狀態(tài)
  • 可能丟失更多數(shù)據(jù):如果Redis意外宕機(jī),從上一次RDB保存到宕機(jī)之間的所有數(shù)據(jù)修改都會(huì)丟失

3.AOF

AOF持久化通過(guò)將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ù)效率問(wèn)題。通過(guò)重寫,可以生成一個(gè)更緊湊的AOF文件,僅包含重建當(dāng)前數(shù)據(jù)集所需的最小命令集合(例如,對(duì)同一個(gè)鍵多次修改會(huì)記錄多條命令,而重寫機(jī)制會(huì)合并這些操作,僅保留最終狀態(tài)的命令)

        父進(jìn)程通過(guò)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文件

        在重寫過(guò)程中,主進(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)。文件前綴名通過(guò)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.aofappendonly.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內(nèi)存回收和內(nèi)存淘汰機(jī)制

    深入理解Redis內(nèi)存回收和內(nèi)存淘汰機(jī)制

    Redis使用多種過(guò)期策略和內(nèi)存淘汰機(jī)制來(lái)管理內(nèi)存,本文主要介紹了深入理解Redis內(nèi)存回收和內(nèi)存淘汰機(jī)制, 具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • redis刪除key下所有value步驟詳解

    redis刪除key下所有value步驟詳解

    在使用Redis時(shí),經(jīng)常需要?jiǎng)h除某個(gè)key下的所有value,本文就來(lái)詳細(xì)的介紹一下redis刪除key下所有value步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Redis利用互斥鎖解決緩存擊穿問(wèn)題

    Redis利用互斥鎖解決緩存擊穿問(wèn)題

    使用互斥鎖可以有效防止緩存擊穿的情況發(fā)生,它能夠保證在緩存失效時(shí),只有一個(gè)線程或者進(jìn)程能夠去加載數(shù)據(jù),其余的請(qǐng)求都會(huì)等待這個(gè)加載過(guò)程完成,雖然這種方式會(huì)犧牲一部分性能,但它大大提高了系統(tǒng)的穩(wěn)定性和可用性
    2024-08-08
  • 為Redis設(shè)置密碼的三種方法

    為Redis設(shè)置密碼的三種方法

    Redis 是一個(gè)高性能的鍵值對(duì)數(shù)據(jù)庫(kù),廣泛應(yīng)用于緩存、消息隊(duì)列等場(chǎng)景,為了保障 Redis 服務(wù)的安全性,設(shè)置密碼認(rèn)證是非常重要的一步,所以本文給大家介紹了為Redis設(shè)置密碼的三種方法,需要的朋友可以參考下
    2024-11-11
  • 使用Redis實(shí)現(xiàn)UA池的方案

    使用Redis實(shí)現(xiàn)UA池的方案

    這篇文章主要介紹了使用Redis實(shí)現(xiàn)UA池的方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Redis實(shí)現(xiàn)用戶簽到的示例代碼

    Redis實(shí)現(xiàn)用戶簽到的示例代碼

    Redis的位圖可以高效實(shí)現(xiàn)用戶簽到功能,每個(gè)bit位對(duì)應(yīng)一個(gè)簽到狀態(tài),節(jié)省存儲(chǔ)空間,利用SETBIT、GETBIT等命令操作簽到數(shù)據(jù),可統(tǒng)計(jì)連續(xù)簽到天數(shù)和本月簽到情況,感興趣的可以了解一下
    2024-09-09
  • Redis分片集群的實(shí)現(xiàn)示例

    Redis分片集群的實(shí)現(xiàn)示例

    本文介紹了搭建Redis分片集群,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Redis生成全局唯一ID的實(shí)現(xiàn)方法

    Redis生成全局唯一ID的實(shí)現(xiàn)方法

    全局唯一ID生成器是一種在分布式系統(tǒng)下用來(lái)生成全局唯一ID的工具,本文主要介紹了Redis生成全局唯一ID的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-06-06
  • Redis教程(十五):C語(yǔ)言連接操作代碼實(shí)例

    Redis教程(十五):C語(yǔ)言連接操作代碼實(shí)例

    這篇文章主要介紹了Redis教程(十五):C語(yǔ)言連接操作代碼實(shí)例,本篇博客是該系列博客中的最后一篇,在這里將給出基于Redis客戶端組件訪問(wèn)并操作Redis服務(wù)器的代碼示例,需要的朋友可以參考下
    2015-05-05
  • React實(shí)現(xiàn)組件之間通信的幾種常用方法

    React實(shí)現(xiàn)組件之間通信的幾種常用方法

    在?React?中,組件之間的通信是構(gòu)建復(fù)雜應(yīng)用程序的核心部分,良好的組件間通信能夠提高代碼的可維護(hù)性和可讀性,同時(shí)能夠高效地管理應(yīng)用狀態(tài),在這篇博客中,我們將探討?React中幾種常用的組件通信方法,并提供示例代碼來(lái)幫助你理解,需要的朋友可以參考下
    2025-02-02

最新評(píng)論

石渠县| 潜江市| 砀山县| 西吉县| 巨野县| 云龙县| 江门市| 聂拉木县| 曲水县| 广河县| 鸡东县| 苍山县| 舟曲县| 阳信县| 襄樊市| 修武县| 磐安县| 安远县| 尉氏县| 鸡东县| 介休市| 疏附县| 年辖:市辖区| 松滋市| 衡南县| 拜泉县| 南皮县| 海原县| 汉寿县| 内黄县| 桃园市| 儋州市| 永安市| 临汾市| 佛冈县| 阿拉善盟| 拉孜县| 淮南市| 乌海市| 泸溪县| 观塘区|