Redis持久化詳解

?【關閉文件、AOF 刷盤、釋放內存這三個任務都有各自的任務隊列】所以不是單線程

Redis有兩種持久化方案:

  • RDB持久化

  • AOF持久化

  • 基于Redis集群解決單機Redis存在的問題

【Redis是單進程的】

【也有人做分布式section】

【主從集群中多個從就是做負載均衡的】

單機的Redis存在四大問題:

RDB持久化

【執行 bgsave 過程中,Redis 依然可以繼續處理操作命令的,也就是數據是能被修改的,關鍵的技術就在于寫時復制技術(Copy-On-Write, COW)。

RDB全稱Redis Database Backup file(Redis數據備份文件),也被叫做Redis數據快照。簡單來說就是把內存中的所有數據都記錄到磁盤中。當Redis實例故障重啟后,從磁盤讀取快照文件,恢復數據。快照文件稱為RDB文件,默認是保存在當前運行目錄。【全量拷貝】

1.執行時機

RDB持久化在四種情況下會執行:

  • 執行save命令

  • 執行bgsave命令

  • Redis停機時

  • 觸發RDB條件時

1)save命令

執行下面的命令,可以立即執行一次RDB:

redis-cli中執行save

save命令會導致主進程執行RDB,這個過程中其它所有命令都會被阻塞。只有在數據遷移時可能用到。

2)bgsave命令

下面的命令可以異步執行RDB:

bgsave

這個命令執行后會開啟獨立進程完成RDB,主進程可以持續處理用戶請求,不受影響。

3)停機時

Redis停機時會執行一次save命令,實現RDB持久化。

4)觸發RDB條件

Redis內部有觸發RDB的機制,可以在redis.conf文件中找到,格式如下:

?# 900秒內,如果至少有1個key被修改,則執行bgsave , 如果是save "" 則表示禁用RDBsave 900 1 ?save 300 10 ?save 60 10000 

RDB的其它配置也可以在redis.conf文件中設置:

?# 是否壓縮 ,建議不開啟,壓縮也會消耗cpu,磁盤的話不值錢rdbcompression yes?# RDB文件名稱dbfilename dump.rdb ??# 文件保存的路徑目錄dir ./ 

2.RDB原理

bgsave開始時會fork主進程得到子進程【此時主進程是阻塞的,所以要加快fork的速度】,子進程共享主進程的內存數據。完成fork后讀取內存數據并寫入 RDB 文件。

fork采用的是copy-on-write(寫時復制技術):內存大時還是很耗時,還需要大量磁盤IO,對性能影響大。

  • 當主進程執行讀操作時,訪問共享內存;

  • 當主進程執行寫操作時,則會拷貝一份數據(數據副本),執行寫操作。fork會把共享內存標記為read-only,以后主進程讀操作時也往副本,頁表變了。

【所有進程都沒法操作物理內存,所以由操作系統給每個進程分配一個虛擬內存,操作系統還會維護虛擬內存和物理內存之間的映射關系表(頁表),從而實現讀寫。fork的過程就是對頁表做拷貝】

【redis一般預留空間,防止被副本翻倍消耗完】

3.小結

RDB方式bgsave的基本流程?

  • fork主進程得到一個子進程,共享內存空間

  • 子進程讀取內存數據并寫入新的RDB文件

  • 用新RDB文件替換舊的RDB文件

RDB會在什么時候執行?save 60 1000代表什么含義?

  • 默認是服務停止時

  • 代表60秒內至少執行1000次修改則觸發RDB

  • 宕機數據會丟失

RDB的缺點?

  • RDB執行間隔時間長,兩次RDB之間寫入數據有丟失的風險

  • fork子進程、壓縮、寫出RDB文件都比較耗時

AOF持久化

【大大提高數據的安全性,彌補RDB】

1.AOF原理

AOF全稱為Append Only File(追加文件)。Redis處理的每一個寫命令都會記錄在AOF文件,可以看做是命令日志文件。【不像RDB每次都從頭開始寫文件,累加】

【先寫到Redis,再把命令寫到AOF文件,將來恢復只需要重新執行命令】

2.AOF配置

AOF默認是關閉的,需要修改redis.conf配置文件來開啟AOF:

?# 是否開啟AOF功能,默認是noappendonly yes# AOF文件的名稱appendfilename "appendonly.aof"

AOF的命令記錄的頻率也可以通過redis.conf文件來配:

?# 表示每執行一次寫命令,立即記錄到AOF文件,先操作內存再寫到磁盤(性能最差)appendfsync always # 寫命令執行完先放入AOF緩沖區,然后表示每隔1秒將緩沖區數據寫到AOF文件,是默認方案appendfsync everysec # 寫命令執行完先放入AOF緩沖區,由操作系統決定何時將緩沖區內容寫回磁盤appendfsync no

三種刷盤策略對比:

3.AOF文件重寫

【AOF執行rewrite的緩沖區。無法設置容量上限】

因為是記錄命令,AOF文件會比RDB文件大的多。而且AOF會記錄對同一個key的多次寫操作,但只有最后一次寫操作才有意義。通過執行bgrewriteaof命令(后臺子進程 bgrewriteaof來完成),可以讓AOF文件執行重寫功能,用最少的命令達到相同效果。

【子進程帶有主進程的數據副本,這里使用子進程而不是線程,防止共享數據更改(只讀)(主進程修改了會發生「寫時復制」,所以用副本保證數據安全)時使用鎖降低性能】

【aof文件壓縮后看不懂,此時再加命令會接著寫,不過不會反壓縮回來】

set num 123 和 set num 666都是對num的操作,第二次會覆蓋第一次的值,因此第一個命令記錄下來沒有意義。【讀取當前數據庫中的所有鍵值對,然后將每一個鍵值對用一條命令記錄到「新的 AOF 文件」】

所以重寫命令后,AOF文件內容就是:mset name jack num 666

Redis也會在觸發閾值時自動去重寫AOF文件。閾值也可以在redis.conf中配置:

?# AOF文件比上次文件 增長超過多少百分比則觸發重寫auto-aof-rewrite-percentage 100# AOF文件體積最小多大以上才觸發重寫 auto-aof-rewrite-min-size 64mb 

RDB與AOF對比

RDB和AOF各有自己的優缺點,如果對數據安全性要求較高,在實際開發中往往會結合兩者來使用。

【一般兩者一起用】

【RDB相當于備份,異地容災,機房毀了,aof也廢了】

【aof寫磁盤多,好在是異步的】

混合

前部分是rdb,當同步過程新來的就會進行aof降低數據丟失率。

  • 兼容性差,如果開啟混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前版本了。

混合持久化是在AOF持久化的基礎上,定期進行RDB持久化。具體實現方式是在AOF重寫時,將RDB文件以二進制壓縮格式寫入到AOF文件的開頭,之后的數據再以AOF格式追加到文件的末尾。這樣,在Redis重啟時,可以優先加載RDB部分的數據,快速恢復大部分數據,然后再通過AOF部分的命令來更新內存中的數據,以保證數據的完整性。

總結

Redis的持久化雖然可以保證數據安全,但也會帶來很多額外的開銷,因此持久化請遵循下列建議:

  • 用來做緩存的Redis實例盡量不要開啟持久化功能【提高查詢效率的不需要持久化,查詢時再寫一遍就好。對于安全性要求高的,比如分布式鎖、庫存、驗訂單的流水需要持久化(可以專門放在一個redis實例)】

  • 建議關閉RDB持久化功能,使用AOF持久化【可以混合。rdb會丟失數據】

  • 利用腳本定期在slave節點做RDB,實現數據備份

  • 設置合理的rewrite閾值,避免頻繁的bgrewrite

  • 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期間做aof,避免因AOF引起的阻塞【主從同步時還是要fork(大量磁盤IO),rewrite也有磁盤IO且時間長,aof刷盤也需要讀寫磁盤。rewrite占用磁盤高會影響aof刷盤】fsync刷盤

  • 部署有關建議:

    • Redis實例的物理機要預留足夠內存,應對fork和rewrite【fork可能翻倍,寫時復制】

    • 單個Redis實例內存上限不要太大,例如4G或8G。可以加快fork的速度、減少主從同步、數據遷移壓力

    • 不要與CPU密集型應用部署在一起【fork等CPU要求高。es也高】

    • 不要與高硬盤負載應用一起部署。例如:數據庫、消息隊列


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

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

相關文章

如何在Java中實現函數式編程

如何在Java中實現函數式編程 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 在Java中,函數式編程是一種編程范式,它將計算視為數學函數…

在Linux系統中查找并計數正在運行的ffmpeg進程數量

ps aux | grep "ffmpeg" | grep -v "grep" | wc -l 這條命令是一個組合命令,用于在Linux系統中查找并計數正在運行的ffmpeg進程數量,同時排除了搜索命令本身(即grep "ffmpeg")的干擾。下面是對每個…

Java識別圖片中的二維碼

引入依賴 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.10</version> </dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacp…

while陳述

回圈是用來進行進行重復性的工作&#xff0c;典型的回圈會進行下列三項基本任務 1. 控制變數初始設定2. 回圈結束條件測試3. 調整控制變數的值 關鍵字 while構成C 中回圈的一種&#xff0c;常用于沒有確定重復次數的回圈&#xff0c;同時while后面接著小括弧為回圈結束的條件…

上位機第二彈

之前寫的代碼用上了 現在想想 &#xff0c;北向一側還挺難搞&#xff0c;設計很巧妙

Continual Test-Time Domain Adaptation--論文筆記

論文筆記 資料 1.代碼地址 https://github.com/qinenergy/cotta 2.論文地址 https://arxiv.org/abs/2203.13591 3.數據集地址 論文摘要的翻譯 TTA的目的是在不使用任何源數據的情況下&#xff0c;將源預先訓練的模型適應到目標域。現有的工作主要考慮目標域是靜態的情況…

python - 列表 / 元組 / 字符串

一.列表 由于pyhon的變量沒有數據類型&#xff0c;所以python是沒有數組的&#xff08;因為數組只能存放一種類型&#xff0c;要么全部存放整型&#xff0c;要么全部存放浮點型&#xff09;&#xff0c;只有列表list&#xff0c;所以整數&#xff0c;浮點數&#xff0c;字符串…

傳輸線阻抗匹配電阻端接的方式

電路為什么需要端接&#xff1f; 眾所周知&#xff0c;電路中如果阻抗不連續&#xff0c;就會造成信號的反射&#xff0c;引起上沖下沖、振鈴等信號失真&#xff0c;嚴重影響信號質量。所以在進行電路設計的時候阻抗匹配是很重要的考慮因素。 對我們的PCB走線進行阻抗控制已經…

雙指針系列第 8 篇:盛水最多的容器。幾句話講明白!

Leetcode 題目鏈接 思路 取首尾雙指針和水量如下所示&#xff0c;設高度函數為 h ( i ) h(i) h(i)&#xff0c;在下圖中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 觀察以 l l l 為左邊界所能構成的其他水量&#xff0c;與矮的右邊界搭配結果如下。 與高的…

jdk17卸載后換jdk1.8遇到的問題

過程&#xff1a; 1、找到jdk17所在文件夾&#xff0c;將文件夾進行刪除。&#xff08;問題就源于此&#xff0c;因為沒刪干凈&#xff09; 2、正常下載jdk1.8&#xff0c;按照網上步驟配置環境變量&#xff0c;這里我參考的文章是&#xff1a; http://t.csdnimg.cn/Svblk …

【RT摩拳擦掌】如何構建RT AVB switchendpoint平臺

【RT摩拳擦掌】如何構建RT AVB switch&endpoint平臺 一&#xff0c;文檔簡介二&#xff0c;平臺構建2.1 軟硬件情況2.2 配置RT1170 AVB端點2.2.1 1塊MIMXRT1170開發板做talker配置2.2.2 2塊MIMXRT1170開發板做listener配置 2.3 AVB Switch 配置2.3.1 MOTU AVB Switch2.3.2 …

未來的鑰匙在于過去:學歷史的真正意義,震驚!歷史竟然是偶然的?從歷史中尋找未來的方向!

我們自幼接受的教育是&#xff0c;學歷史是為了相信歷史是必然的。中國人民必然戰勝日寇的侵略&#xff0c;解放思想和改革開放必定會發生&#xff0c;和平和發展必定是世界的主題&#xff0c;中國經濟必定是高速增長…… 然而&#xff0c;在真正的歷史學家眼中&#xff0c;歷史…

linux應用開發基礎知識(八)——內存共享(mmap和system V)

mmap內存映射 內存共享定義 內存映射&#xff0c;簡而言之就是將用戶空間的一段內存區域映射到內核空間&#xff0c;映射成功后&#xff0c;用戶對這段內存區域的修改可以直接反映到內核空間&#xff0c;同樣&#xff0c;內核空間對這段區域的修改也直接反映用戶空間。那么對…

海外注冊 | 歐盟醫療器械法規下免除臨床試驗的條件與要求

在歐盟醫療器械法規&#xff08;MDR&#xff09;的嚴格監管下&#xff0c;植入性醫療器械和III類醫療器械通常需要進行臨床試驗來證明其安全性和性能。 然而&#xff0c;MDR也規定了一些特定情況下免除臨床試驗的可能性。以下是免除臨床試驗的條件和要求的詳細說明&#xff1a…

MVC(Model-View-Controller)模式

MVC&#xff08;Model-View-Controller&#xff09;模式三個主要組件&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;視圖&#xff08;View&#xff09;&#xff0c;和控制器&#xff08;Controller&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;&a…

【高中數學/基本不等式】已知:a,b皆為正數,且1/(2a+b)+1/(a+2b)=1 求:a+b的最小值?

【問題來源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 第二題 【問題】 已知&#xff1a;a,b皆為正數&#xff0c;且1/(2ab)1/(a2b)1 求&#xff1a;ab的最小值&#xff1f; 【解答】 解&#xff1a;此題也有分母難消的問題&#xff…

人口萎縮,韓國釜山“進入消失階段”

KlipC報道&#xff1a;調查顯示&#xff0c;隨著低生育率和人口老化&#xff0c;釜山人口逐漸萎縮&#xff0c;韓國第二大城市釜山顯現出“進入消失階段”的跡象。 據悉&#xff0c;“消失風險指數”是將20歲至39歲女性人口總數除以65歲及以上人口得到的數值。當該指數大于1.5…

自然語言處理學習(2)基本知識 文本預處理+文本數據分析+文本增強

conda activate DL conda deactivate課程鏈接 一 一些包的安裝 1 stanfordcorenlp 在anoconda prompt 里面&#xff1a;進入自己的conda環境&#xff0c;pip install stanfordcorenlp 進入方式 相關包下載&#xff0c;Jar包我沒有下載下來&#xff0c;太慢了&#xff0c;這個…

記錄Atlas800服務器環境安裝

一、創建安裝賬號 groupadd HwHiAiUser useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash二、下載依賴包 以下包根據需求自行下載 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.5.0-0-Linux-aarch64.sh wg…

debug-mmlab

mmyolo bug1: MMYOLO for yolov5 instance segmentation on balloon dataset getting this error "ValueError: Key img_path is not in available keys. solution: pip install albumentations1.3.1 reference