Redis--持久化策略(AOF與RDB)

持久化策略(AOF與RDB)

  • 持久化
    • Redis如何實現數據不丟失?
    • RDB 快照是如何實現的呢?
      • 執行時機
      • RDB原理
        • 執行快照時,數據能被修改嗎?
    • AOF持久化是怎么實現的?
      • AOF原理
      • 三種寫回策略
      • AOF重寫機制
    • RDB和AOF合體

持久化

Redis如何實現數據不丟失?

Redis 共有三種數據持久化的方式:

  • AOF 日志:每執行一條寫操作命令,就把該命令以追加的方式寫入到一個文件里;
  • RDB 快照:將某一時刻的內存數據,以二進制的方式寫入磁盤;
  • 混合持久化方式:Redis 4.0 新增的方式,集成了 AOF 和 RBD 的優點;

RDB 快照是如何實現的呢?

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

執行時機

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

  • 執行save命令
  • 執行bgsave命令
  • Redis停機時
  • 觸發RDB條件時

1)save命令

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

在這里插入圖片描述

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

2)bgsave命令

下面的命令可以異步執行RDB:
在這里插入圖片描述

會創建一個子進程來生成 RDB 文件,這樣可以避免主線程的阻塞

3)停機時

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

4)觸發RDB條件

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

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

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

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

RDB原理

執行快照時,數據能被修改嗎?

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

bgsave開始時會fork主進程得到子進程,子進程共享主進程的內存數據。完成fork后讀取內存數據并寫入 RDB 文件。

fork采用的是copy-on-write技術:

  • 當主進程執行讀操作時,訪問共享內存;
  • 當主進程執行寫操作時,則會拷貝一份數據,執行寫操作。

在這里插入圖片描述

AOF持久化是怎么實現的?

AOF原理

AOF全稱為Append Only File(追加文件)。Redis處理的每一個寫命令都會記錄在AOF文件,可以看做是命令日志文件。

在這里插入圖片描述

三種寫回策略

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

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

Redis 寫入 AOF 日志的過程,如下圖:

img

過程如下:

  1. Redis 執行完寫操作命令后,會將命令追加到 server.aof_buf 緩沖區;
  2. 然后通過 write() 系統調用,將 aof_buf 緩沖區的數據寫入到 AOF 文件,此時數據并沒有寫入到硬盤,而是拷貝到了內核緩沖區 page cache,等待內核將數據寫入硬盤;
  3. 具體內核緩沖區的數據什么時候寫入到硬盤,由內核決定。

上面第三步AOF的命令記錄的頻率可以通過redis.conf文件來配:

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

三種策略對比:

在這里插入圖片描述

根據自己的業務場景進行選擇:

  • 如果要高性能,就選擇 No 策略;
  • 如果要高可靠,就選擇 Always 策略;
  • 如果允許數據丟失一點,但又想性能高,就選擇 Everysec 策略。

深入到源碼后,你就會發現這三種策略只是在控制 fsync() 函數的調用時機。

AOF重寫機制

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

在這里插入圖片描述

如圖,AOF原本有三個命令,但是set num 123 和 set num 666都是對num的操作,第二次會覆蓋第一次的值,因此第一個命令記錄下來沒有意義。

所以重寫命令后,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各有自己的優缺點,如果對數據安全性要求較高,在實際開發中往往會結合兩者來使用。

在這里插入圖片描述

在 Redis 4.0 提出一個新的方法混合使用 AOF 日志和內存快照,也叫混合持久化。

如果想要開啟混合持久化功能,可以在 Redis 配置文件將下面這個配置項設置成 yes:

aof-use-rdb-preamble yes

混合持久化工作在 AOF 日志重寫過程

當開啟了混合持久化時,在 AOF 重寫日志時,fork 出來的重寫子進程會先將與主線程共享的內存數據以 RDB 方式寫入到 AOF 文件,然后主線程處理的操作命令會被記錄在重寫緩沖區里,重寫緩沖區里的增量命令會以 AOF 方式寫入到 AOF 文件,寫入完成后通知主進程將新的含有 RDB 格式和 AOF 格式的 AOF文件替換舊的的 AOF 文件。

使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量數據,后半部分是 AOF 格式的增量數據

這樣的好處在于,重啟 Redis 加載數據的時候,由于前半部分是 RDB 內容,這樣加載的時候速度會很快

加載完 RDB 的內容后,才會加載后半部分的 AOF 內容,這里的內容是 Redis 后臺子進程重寫 AOF 期間,主線程處理的操作命令,可以使得數據更少的丟失

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

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

相關文章

C高級:思維導圖Day2

目錄 總覽1 總覽2 總覽1 壓縮與解壓縮 打包與解包 軟連接與硬鏈接 ubuntu下關機與重啟指令 總覽2 結束

pwntools用法

pwntools 是一個Python庫, 用于編寫二進制漏洞利用(exploitation)腳本 功能: 遠程連接和本地連接: 支持通過TCP/UDP連接遠程服務或與本地進程進行交互。Shellcode和ROP鏈構造: 提供了便捷的工具來生成和利…

【每日學點鴻蒙知識】placement設置top、組件攜帶自定義參數、主動隱藏輸入框、Web設置字體、對話框設置全屏寬

1、popup組件placement設置top沒有生效? 可以用offset屬性將popup往下邊偏移一下 來規避 2、組件攜帶自定義參數的接口是哪個? 參考鏈接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-…

PyTorch快速入門教程【小土堆】之優化器

視頻地址優化器(一)_嗶哩嗶哩_bilibili import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR1…

數據庫篇:mysql內置函數

前言 sql 是程序開發員繞不開的一項技能,而mysql是當前最流行的數據庫,熟知其內置的一些函數,可以使我們平時的開發工作更加順暢和方便 時間日期函數 字符串函數 數學計算相關函數 條件判斷函數 加密和壓縮函數 聚合函數 格式或類型轉…

C# 中 Webclient和Httpclient

在C#中,WebClient和HttpClient,這兩個類都是用于發起HTTP請求的客戶端,它們在使用API上傳文件或數據時有不同的優缺點和應用場景。在C#中WebClient是一種較早的網絡客戶端,而HttpClient是后期提供的更現代的、功能更強大的HTTP客戶…

權限獲得第一步

權限獲得第一步 下載打開附件 給了一串加密的密文 一般都是用MD5加密,每一段分別解碼一下 第一段不行,試一下第二段 這里發現第二段可以解碼出來,這應該就是密碼了 flag{3617656}

HTML 輪播圖(Carousel)詳細講解

HTML 輪播圖(Carousel)詳細講解 輪播圖(Carousel)是一種常見的用戶界面組件,用于在同一位置展示多個圖像或內容,允許用戶通過滑動或自動播放的方式查看不同的內容。它通常用于展示產品、圖片、廣告等。 1…

25秋招面試總結

秋招從八月底開始,陸陸續續面試了不少,現在也是已經塵埃落定,在這里做一些總結一些我個人的面試經歷 騰訊 騰訊是我最早面試的一家,一開始撈我面試的是數字人民幣,安全方向的崗位,屬于騰訊金融科技這塊。…

一份關于 Ubuntu 系統下代理配置的故障排查筆記

Ubuntu 網絡代理配置與故障排查指南 在使用 Ubuntu 系統時,配置網絡代理可以幫助提升網絡訪問速度或突破網絡限制。然而,代理配置過程中可能會遇到各種問題。本文將詳細介紹如何在 Ubuntu 下配置網絡代理,并提供故障排查的步驟和解決方案。 …

001__VMware軟件和ubuntu系統安裝(鏡像)

[ 基本難度系數 ]:★☆☆☆☆ 一、Vmware軟件和Ubuntu系統說明: a、Vmware軟件的說明: 官網: 歷史版本: 如何下載? b、Ubuntu系統的說明: 4、linux系統的其他版本:紅旗(redhat)、dibian、cent…

fiscoBcos中webase平臺導出java項目

導出合約為java項目并調用 1. 在webase管理平臺上面進行項目的導出 2.將下載好的項目解壓并用idea打開,目錄結構如下 在resources目錄下的abi放的是編譯過后的合約方法,bin.ecc放的是以編譯過后的智能合約,conf文件夾下面放的是鏈…

【嵌入式C語言】指針數組結構體

指針與數組 指針與數組指針數組數組指針 多維數組數組名的保存 結構體定義結構體定義結構體變量使用typedef簡化結構體聲明訪問結構體成員結構體內存分配字節對齊位域定義位域位域的限制示例 指針與數組 指針數組和數組指針是兩個不同的概念,它們涉及到指針和數組的…

Junit4單元測試快速上手

文章目錄 POM依賴引入業務層測試代碼Web層測試代碼生成測試類文件 在工作中我用的最多的單元測試框架是Junit4。通常在寫DAO、Service、Web層代碼的時候都會進行單元測試&#xff0c;方便后續編碼&#xff0c;前端甩鍋。 POM依賴引入 <dependency><groupId>org.spr…

ubuntu 20.04 國內源安裝docker

先更新軟件包&#xff0c;安裝備要apt軟件 # 更新軟件包索引 sudo apt-get update# 安裝需要的軟件包以使apt能夠通過HTTPS使用倉庫 sudo apt-get install ca-certificates curl gnupg lsb-release使用阿里云源 # 添加阿里云官方GPG密鑰 curl -fsSL http://mirrors.aliyun.co…

【優選算法】查找總價格為目標值的兩個商品(雙指針)

算法_云邊有個稻草人的博客-CSDN博客 目錄 解法一&#xff1a;暴力算法 解法二&#xff1a;雙指針(時間復雜度為O&#xff08;N&#xff09;) 【代碼編寫】 LCR 179. 查找總價格為目標值的兩個商品 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力算法 用…

時空信息平臺-API安全措施-下篇:登錄鑒權【訪問受限】您的請求已被該站點的安全策略攔截。

文章目錄 引言I 登錄鑒權處理邏輯校驗順序用戶狀態校驗密碼校驗Token鑒權短信驗證碼/圖形驗證碼登錄設備限制II 服務端發生錯誤的處理業務返回碼處理前端處理業務返回碼nginx處理http狀態碼引言 時空信息平臺-API安全措施:上篇(通訊協議的安全措施) https://blog.csdn.net/z…

UE(虛幻)學習(三) UnrealSharp插件中調用非托管DLL

上一篇文章中我使用UnrealSharp成功使用了我的一個C#控制臺程序中的網絡模塊&#xff0c;這個程序是基于KCP網絡了&#xff0c;其中調用了Cmake 編譯的一個C的DLL&#xff0c;在虛幻中DLL需要放在Binaries目錄中才可以。Unity中只要放在任意Plugins目錄中就可以。 但是Binaries…

編譯openssl遇到錯誤Parse errors: No plan found in TAP output的解決方法

在編譯openssl時 tar -zxvf openssl-1.1.1p.tar.gz cd openssl-1.1.1p ./config --prefix/usr --openssldir/etc/ssl --shared zlib make make test 遇到錯誤 Parse errors: No plan found in TAP output 解決方法&#xff1a; yum install perl-Test-Simple

IO多路復用(select/epoll)

目錄 一、概念 二、語法 1.select 1.1 select函數的語法 1.2 文件描述符集合操作 1.3 select函數的優缺點 2.epoll 2.1 epoll語法 2.2 epoll的工作模式 2.3 epoll的優缺點 三、select服務端代碼 四、epoll服務端代碼 五、客戶端代碼 一、概念 IO多路復用是一種同…