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

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

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

1.概述

Redis是一個基于內(nèi)存的數(shù)據(jù)庫,這意味著其主要數(shù)據(jù)存儲和操作均在內(nèi)存中進行。這種設(shè)計使得Redis能夠提供極快的讀寫速度(通常達到微秒級別),適用于高性能場景,如緩存

  • 然而,由于內(nèi)存的易失性(斷電后數(shù)據(jù)會丟失),Redis提供了持久化機制:將內(nèi)存中的數(shù)據(jù)保存到磁盤中,確保數(shù)據(jù)在Redis服務(wù)重啟或崩潰后能夠恢復(fù)。通過持久化,可以避免數(shù)據(jù)丟失,提高數(shù)據(jù)的可靠性
  • Redis提供兩種持久化方式
    • RDB(Redis Database):生成數(shù)據(jù)集的快照實現(xiàn)持久化
    • AOF(Append Only File):記錄所有寫操作命令,以追加方式寫入文件

2.RDB

RDB指的是Redis的一種持久化機制,其核心是生成Redis數(shù)據(jù)在某個時間點的快照

2.1 快照原理

由于Redis是單線程應(yīng)用程序,在線上環(huán)境時,不僅要處理來自客戶端的請求,還要執(zhí)行內(nèi)存快照操作(進行文件IO)。單線程同時處理客戶端請求和文件IO時會嚴重降低服務(wù)器性能,甚至阻塞客戶端請求。因此,Redis使用 fork寫實拷貝(Copy On Write) 機制來實現(xiàn)快照持久化

fork

        Redis在進行RDB持久化時會調(diào)用fork函數(shù)來創(chuàng)建一個子進程負責完成,父進程則繼續(xù)處理客戶端請求。子進程在創(chuàng)建之初和父進程共享同一數(shù)據(jù)段

        Linux操作系統(tǒng)的內(nèi)存空間被分為很多種片段,每個片段又被分為很多個頁面,每個頁面4KB

寫實拷貝

        當父進程對數(shù)據(jù)段中的某一數(shù)據(jù)頁面進行修改操作時,Linux操作系統(tǒng)會將該數(shù)據(jù)頁面復(fù)制一份分離出來,然后對該頁面進行修改,最后父進程指向指向修改后的頁面。隨著被修改的頁面越來越多,內(nèi)存空間不斷膨脹,最多達到原來的兩倍
        從子進程被創(chuàng)建出來的那一刻起,直至拷貝結(jié)束,子進程始終指向原始的數(shù)據(jù)段且所有原數(shù)據(jù)段不會被修改。所以,在整個拷貝過程中 RDB快照 = 子進程看到的所有數(shù)據(jù)頁面的瞬間狀態(tài)集合

        拷貝完成后,子進程會被銷毀,同時沒有指針指向的數(shù)據(jù)頁面也會被銷毀

2.2 觸發(fā)機制

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

  • 自動觸發(fā)
    • 在redis.conf中通過save指令配置閾值。當在指定時間內(nèi)發(fā)生足夠數(shù)量的鍵修改時自動觸發(fā)bgsave
    • 正常關(guān)閉Redis
      # 默認執(zhí)行save(阻塞式)
      > shutdown
      # 或
      > shutdown save
      
      # 觸發(fā)流程:
      1. 停止接受新連接
      2. 執(zhí)行save(不是bgsave)
      3. 保存完成后退出
      
  • 手動觸發(fā)
    • save命令:同步阻塞式觸發(fā),執(zhí)行期間Redis服務(wù)器不處理任何請求,直到RDB文件創(chuàng)建完成(不推薦)
    • bgsave命令:異步非阻塞式觸發(fā),Redis會fork一個子進程執(zhí)行持久化操作,主進程繼續(xù)處理請求

2.3 文件處理

        RDB文件保存在dir配置指定的目錄下(默認/var/lib/redis),文件名通過dbfilename配置指定(默認dump.sql)
        在RDB備份過程中,fork出的子進程會將內(nèi)存數(shù)據(jù)寫入臨時文件,臨時文件默認命名規(guī)則為temp-< pid >.rdb,其中< pid >是子進程的進程ID。當子進程完成RDB文件寫入后,Redis會用原子性的rename操作將臨時文件重命名為正式RDB文件并刪除原文件

2.4 優(yōu)缺點

優(yōu)點

  • 恢復(fù)速度快:RDB是數(shù)據(jù)的二進制快照,恢復(fù)時直接加載到內(nèi)存
  • 備份時對服務(wù)影響小:使用bgsave命令時,Redis通過fork子進程在后臺保存數(shù)據(jù),主進程可以繼續(xù)處理客戶端請求,幾乎無阻塞
  • 存儲高效:RDB 文件使用二進制格式并支持LZF壓縮

缺點

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

3.AOF

AOF持久化通過將Redis服務(wù)器接收到的每個寫命令追加到文件末尾來實現(xiàn)

# 開啟AOF
appendonly yes

3.1 工作流程

  • 命令追加:當Redis執(zhí)行寫命令時,該命令會以Redis協(xié)議格式追加到內(nèi)存中的AOF緩沖區(qū)(aof_buf)。緩沖區(qū)會根據(jù)配置策略決定何時將內(nèi)容同步到磁盤
  • 文件寫入與同步:AOF緩沖區(qū)內(nèi)容會被寫入到AOF文件,具體同步到磁盤的時機由appendfsync參數(shù)控制:
    • always:每次寫命令后同步,數(shù)據(jù)安全性最高但性能影響較大
    • everysec:每秒同步一次,平衡性能與安全性(默認配置)
    • no:由操作系統(tǒng)決定同步時機,性能最好但可能丟失較多數(shù)據(jù)

3.2 重寫機制

作用:解決AOF文件不斷增長導(dǎo)致的存儲空間占用和恢復(fù)效率問題。通過重寫,可以生成一個更緊湊的AOF文件,僅包含重建當前數(shù)據(jù)集所需的最小命令集合(例如,對同一個鍵多次修改會記錄多條命令,而重寫機制會合并這些操作,僅保留最終狀態(tài)的命令)

        父進程通過fork創(chuàng)建一個子進程來完成AOF文件的重寫,確保主進程繼續(xù)處理客戶端請求。子進程會讀取當前數(shù)據(jù)庫的快照數(shù)據(jù),并將其轉(zhuǎn)換為一系列Redis命令寫入新的臨時AOF文件

        在重寫過程中,主進程會將新接收到的寫命令同時寫入現(xiàn)有的AOF 緩沖區(qū)aof_buf(保證原有 AOF 文件正常更新)和AOF重寫緩沖區(qū)aof_rewrite_buf(保證新命令不會丟失)

        當子進程完成重寫后,會通知主進程。主進程會將 AOF 重寫緩沖區(qū)中的命令追加到新生成的臨時 AOF 文件中,最后原子性地替換舊文件

        在Redis7.0.15版本,AOF文件保存在dir + appenddirname配置指定的目錄下(默認/var/lib/redis/appendonlydir)。文件前綴名通過appendfilename配置指定(默認appendonly)

  • appendonly.aof.1.base.rdb:作為Redis AOF(Append-Only File)持久化機制的基準文件,存儲某一時刻數(shù)據(jù)庫的完整快照。格式為RDB,體積較小且加載速度快,用于重建數(shù)據(jù)的基礎(chǔ)狀態(tài)
  • appendonly.aof.1.incr.aofappendonly.aof.2.incr.aof:記錄基準文件生成后的增量寫操作命令,以文本形式追加存儲。多個增量文件按操作順序編號(如.1.incr.aof、.2.incr.aof),Redis 重啟時會按順序重放這些命令以恢復(fù)最新數(shù)據(jù)
  • appendonly.aof.manifest:描述AOF文件的組成和順序的清單文件

4.混合持久化

        Redis 混合持久化結(jié)合了 RDB(快照)和 AOF(日志)兩種持久化方式的優(yōu)勢,在保證數(shù)據(jù)安全性的同時兼顧性能

# 開啟混合持久化
aof-use-rdb-preamble yes
  • 基礎(chǔ)RDB文件優(yōu)先加載:appendonly.aof.1.base.rdb作為全量快照數(shù)據(jù)文件,會優(yōu)先被加載。該文件包含某一時間點的完整數(shù)據(jù)快照,恢復(fù)時作為基準數(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的原理機制講解(圖文教程)的文章就介紹到這了,更多相關(guān)Redis持久化RDB和AOF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

    Redis利用互斥鎖解決緩存擊穿問題

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

乌兰浩特市| 甘孜县| 铜陵市| 广宗县| 西林县| 忻州市| 新和县| 垫江县| 安福县| 沐川县| 开化县| 城市| 嵊州市| 保定市| 新龙县| 嘉定区| 东光县| 萨嘎县| 利川市| 谷城县| 上栗县| 枞阳县| 玉门市| 滨州市| 北安市| 师宗县| 杭锦后旗| 保山市| 保德县| 沾化县| 勐海县| 房山区| 乐清市| 紫金县| 友谊县| 乌拉特前旗| 垫江县| 塔城市| 崇阳县| 大厂| 马龙县|