Redis--持久化機制詳解

什么是redis持久化?

Redis持久化是將內存的數據持久化到磁盤上,防止Redis宕機或者斷點的時候內存中的數據丟失,把內存中的數據寫入到磁盤的過程叫持久化。

Redis持久化的方式?

  • RDB(Redis DataBase):在指定時間間隔內將內存中的數據以快照的方式寫入到磁盤上,Redis默認的持久化方式。
  • AOF(Append Of File):以日志的形勢記錄每個寫命令、刪除命令。
  • 混合持久化:混合持久化并不是一種全新的持久化方式,它只是同時使用了RDB和AOF兩種模式,是Redis 4.0版本開啟的功能,通過aof-use-rdb-preamble配置參數開啟,yes表示開啟,no表示禁用,默認禁用。

RDB持久化詳解:

RDB持久化流程:

  • 客戶端觸發或者自動執行bagesave命令。
  • 主進程判斷是否存在正在執行的子進程,存在返回。
  • 不存在的話fork一個子進程進行持久化數據,fork過程中是阻塞的,fork操作完成后,主進程即可執行其他操作。
  • 子進程先將數據寫入臨時rdb文件中,數據寫入完成后替換舊的rdb文件,同時通知主進程RDB持久化完成。

RDB持久化的優缺點:
優點:

  • 文件緊湊,全量備份,適合數據備份和災難恢復。
  • 生成RDB文件時,redis主進程會fork()一個子進程來保存工作,主進程不需要進行任何IO操作。
  • RDB在恢復大數據集時速度比AOF的恢復速度要快。

缺點:

  • 因為RDB需要保存整個數據集,所以不是一個輕松的操作,因此一般不會設置太短時間,因此一段發生故障停機,會丟失幾分鐘的數據。
  • 如果數據集過大的情況下,所fork子進程在協助完成持久化時,所可能導致服務器停止幾百毫秒,所甚至幾秒鐘。

AOF持久化流程:
AOF文件只記錄寫命令,不記錄讀命令,當服務端接收到寫命令后,redis會將命令寫入到aof緩沖區中,只所以寫入緩沖區而不直接寫入到文件中,是因為每次直接將命令寫入文件中,那redis的性能將完全取決于硬盤的讀寫能力,影響redis性能。

AOF工作流程圖:
在這里插入圖片描述

AOF三種同步策略:

  1. always(總是):每次執行了寫入或刪除的命令寫入緩沖區后,就調用系統fsync將redis執行的命令寫入aof文件中,fsync操作完成后主線程返回。
  2. no:命令寫入緩沖區后,調用操作系統的write操作,Redis不主動將命令同步到aof文件中,同步動作由操作系統來負責,一般是30秒一次。
  3. everysec:命令寫入緩沖區后,調用操作系統的write操作,write操作完成之后,有專門的線程每秒執行fsync操作。

AOF持久化的優缺點:
優點:

  • AOF持久化幾乎不丟失數據,最多丟失一秒的數據。
  • AOF機制采用的是append模式,因此即使在寫入過程發生宕機,也不會破壞日志文件中已經存在的內容,如果本次操作只寫入了一半就出現了系統宕機,redis下一次重啟的時候,可以通過redis-check-aof來解決數據一致性問題。
  • 如果日志文件過大,redis可以自動啟用rewriter機制,redis以append模式不斷的將修改數據寫入到磁盤中,同時會創建一個新的文件記錄此期間有哪些命令被修改,在rewriter期間可以更好的保證數據安全性。
  • AOF包含一個格式清晰易于理解的日志文件,也可以通過該文件完成數據重建。

缺點:

  • 對于相同的數據集來說,AOF的文件體積一般大于RDB文件的體積。
  • 對redis性能有一定的損耗。
  • 相對RDB持久化的方式的數據恢復速度,AOF持久化的方式數據恢復速度會更慢一些。

AOF rewrite重寫機制是什么意思?
AOF 重寫是為了縮小aof文件,AOF持久化模式是不斷的記錄Redis寫入、刪除命令到文件中,隨著命令的越來越多,文件會越來越大,aof重寫會把過程操作過程去掉,把多個命令合并成一個命令,這樣就縮小了AOF文件。

AOF rewrite作用:

  1. 使aof文件變的更小,占用更少的磁盤空間。
  2. aof文件編的更小后,在數據恢復的時候會更快。

AOF rewrite流程圖:
在這里插入圖片描述

AOF 重寫規則?

  1. 進程內已經過期的數據不再寫入文件。
  2. 只保存最終的寫入命令,如set a 1,set a 2,set a 3,此時只保留set a 3。
  3. 多條寫命令合并為一條命令,如lpush list 1,lpush list 2,lpush list 3,合并為lpush list 1,2,3,同時為了防止單條命令過大,對于list set zset hash 等以64個元素為界限拆分為多條命令。

什么是混合持久化?
混合持久化是redis4.0版本添加的新功能,通過aof-use-rdb-preamble配置參數開啟,yes表示開啟,no表示禁用,默認禁用,混合持久化體現在aofrewrite時,先寫一份全量RDB數據到aof文件中,后續AOF重寫緩沖區里的數據繼續追加到該文件中,因為開啟了混合持久化后,appendonly.aof文件開頭是RDB格式,后續是AOF格式。
使用混合持久化后,Redis在重啟數據恢復時候,會先加載RDB的內容,然后再執行AOF日志就可以完全替代之前的AOF全量文件執行,重啟數據恢復的速度得到大大提升。

Redis進行持久化的時候會阻塞主線程嗎?
fork子進程過程是阻塞的,fork過程就是創建一個主進程的副本,創建的子進程除了進程id,其余任何內容和主進程完全一致,這就是fork,fork的子進程獨立于主進程存在,雖然兩個進程內存空間內容完全一致,但是對于內存的寫入、修改以及文件的映射都是獨立的,兩個進程互不影響,開啟aof持久化,使用everysec同步策略時,會發生aof追加阻塞,出現aof阻塞的原因是磁盤負載過高,redis主進程會監控同步線程每次她同步aof緩沖區到aof文件的消耗時間,如果距離上次同步成功時間在2S內,那么主線程就會返回,如果超過2S,redis主進程會阻塞,直到同步完成,不管是RDB還是AOF持久化,都會使用fork創建一個子進程來處理,fork出來的子進程不會阻塞主進程,但是fork的過程還是會阻塞主進程,一般來說主進程內存越大,需要復制的空間內存葉也比較大,fork所需的時間也會長,redis阻塞的時間越長。

本文偏概念、偏面試八股,但學習理解了不管是對工作還是對面試都是有一定的幫助。
如有不正確的地方請各位指出糾正。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713278.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全量知識系統問題及SmartChat給出的答復 之10 三套工具之5語法解析器之3

Q27. 從前面可以看出,IPP解析器給出兩種文法規則,一種是人工的(文字處理和文本理解),一種是機器的(圖形算法和圖像處理)。前者可以是一套文寫文章的注釋工具的底層,可以使用顏色來著…

Jmeter分布式部署

前期準備: 1. 控制機一臺,代理機一臺,Jmeter安裝包 操作步驟: 1. Linux安裝Jmeter(windows安裝教程自己搜一下) 1.1創建一個單獨的文件夾(jmeter),用來存放Jmeter的安裝包 mkdir jmeter 1.2…

centos7升級openssl_3

1、查看當前openssl版本 openssl version #一般都是1.幾的版本2、下載openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解壓 tar zxf openssl-3.0.3.tar.gz#進入指定的目錄 cd openssl-3.0.33、編譯安裝遇到問題缺…

vscode設置打開瀏覽器

安裝這個插件 Open Browser Preview

全排列 全排列 II N皇后

46.全排列 力扣題目鏈接(opens new window) 給定一個 沒有重復 數字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3]輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 遞歸終止條件:當收集元素的數組path的大小達到和nums數組…

CSP-201803-1-跳一跳

CSP-201803-1-跳一跳 解題思路 使用getline函數接收一行輸入,即玩家的跳躍序列。初始化總得分scoreSum為0,上一次得分lastGrade為2(因為跳到中心的初始得分是2),以及一個布爾標志flag表示上一次是否跳到了中心&#…

Thinkphp框架漏洞--->5.0.23 RCE

1.Thinkphp ThinkPHP是一個免費開源的,快速、簡單的面向對象的輕量級PHP開發框架,是為了敏捷WEB應用開發和簡化 企業應用開發而誕生的。 2.漏洞原理及成因 該漏洞出現的原因在于 ThinkPHP5框架底層對控制器名過濾不嚴 ,從而讓攻擊者可以通過…

lotus 從礦工可用余額扣除扇區質押

修改 miner配置文件 # Whether to use available miner balance for sector collateral instead of sending it with each message## type: bool# env var: LOTUS_SEALING_COLLATERALFROMMINERBALANCE#CollateralFromMinerBalance falseCollateralFromMinerBalance true質押金…

(Sora模型風口)2024最新GPT4.0使用教程,AI繪畫,一站式解決

一、前言 ChatGPT3.5、GPT4.0、GPT語音對話、Midjourney繪畫,文檔對話總結DALL-E3文生圖,相信對大家應該不感到陌生吧?簡單來說,GPT-4技術比之前的GPT-3.5相對來說更加智能,會根據用戶的要求生成多種內容甚至也可以和…

代碼隨想錄算法訓練營第10天| 232. 用棧實現隊列、225. 用隊列實現棧

232. 用棧實現隊列 題目鏈接 232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; 思路 記得是用兩個棧實現的隊列&#xff0c;但是細節記不太住&#xff0c;看了視頻才勉強縫縫補補做出來。 本人題解 class MyQueue { public:stack<int> stackIn;stack<…

【C語言】動態內存管理常用函數

前言 我們在之前學習的數組開辟的空間是固定不變的&#xff0c;有時候我們需要的空間??在程序運?的時候才能知道~ c語言中的動態內存開辟&#xff0c;讓程序員??可以根據實際需求申請和釋放相應空間&#xff0c;這使得空間的開辟變得靈活了許多。 歡迎關注個人主頁&#x…

小程序配置服務器域名的操作步驟(入門級)

將詳細列出小程序配置服務器域名的操作步驟&#xff1a; 服務器選購推薦&#xff1a;騰訊云輕量服務器 點擊以下任一云產品鏈接&#xff0c;跳轉后登錄&#xff0c;自動享有所有云產品優惠權益&#xff1a; 經過筆者親測&#xff0c;強烈推薦騰訊云輕量應用服務器作為游戲服…

微服務簡介及其相關技術棧

目錄 1、簡介 2、技術棧 3、單體架構 4、分布式架構 5、微服務 6、總結 &#x1f343;作者介紹&#xff1a;雙非本科大三網絡工程專業在讀&#xff0c;阿里云專家博主&#xff0c;專注于Java領域學習&#xff0c;擅長web應用開發、數據結構和算法&#xff0c;初步涉獵Pyth…

【QT+QGIS跨平臺編譯】之五十七:【QGIS_CORE跨平臺編譯】—【VECTOR_TILE生成】

文章目錄 一、protoc二、生成來源三、構建過程一、protoc Protocol Buffers(簡稱 protobuf)是一種輕量級、高效的數據序列化框架,它可以將結構化數據序列化為二進制格式,同時還可以進行反序列化和數據壓縮。相比于 XML 和 JSON 等傳統的文本序列化格式,protobuf 采用二進制…

wpa_supplicant交叉編譯

文章目錄 源碼編譯openssl編譯libnl交叉編譯WPA 開發板測試使用 源碼 wpa_supplicant官網&#xff1a;http://w1.fi/wpa_supplicant/ GIT源&#xff1a;git://w1.fi/hostap.git openssl 源碼&#xff1a; https://www.openssl.org/ libnl 源碼&#xff1a; https://github.c…

自定義preference的使用

自定義preference的使用 control_iconsize_preference_top.xmlcontrol_iconsize_preference_middle.xmlcontrol_iconsize_preference_bottom.xmlcontrol_iconsize_preference_airplane.xmlcontrol_iconsize_preference_no_arrow_top.xmlcontrol_iconsize_preference_no_arrow_m…

3 開源鴻蒙OpenHarmony4.1源碼下載、編譯,生成OHOS_Image可執行文件的最簡易流程

開源鴻蒙OpenHarmony4.1源碼下載、編譯&#xff0c;生成OHOS_Image可執行文件的最簡易流程 作者將狼才鯨日期2024-03-01 準備一臺Windows電腦 安裝VMware或者VMware Player虛擬機 從華為鏡像下載Ubuntu系統&#xff0c;用國內源下載速度更快 Ubuntu 鏡像說明https://repo.hu…

map和set例題應用

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 目錄 第一題 第二題 第三題 第一題 隨機鏈表的復制https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 思路 首先遍歷舊鏈表&#xff0c;并創建新節點&#xff0c;同時用map將舊節點與新節點…

python模型訓練

目錄 1、新建模型 train_model.py 2、運行模型 &#xff08;1&#xff09;首先會下載data文件庫 &#xff08;2&#xff09;完成之后會開始訓練模型&#xff08;10次&#xff09; 3、 訓練好之后&#xff0c;進入命令集 4、輸入命令&#xff1a;python -m tensorboard.ma…

網絡工程師筆記6

ICMP協議 Internet控制報文協議ICMP(InternetControlMessage Protocol)是網絡層的一個重要協議。ICMP協議用來在網絡設備間傳遞各種差錯和控制信息&#xff0c;它對于收集各種網絡信息、診斷和排除各種網絡故障具有至關重要的作用。使用基于ICMP的應用時&#xff0c;需要對ICMP…