Redis基礎系列-持久化

Redis基礎系列-持久化

文章目錄

  • Redis基礎系列-持久化
    • 1. 什么是持久化
    • 2. 為什么要持久化
    • 3. 持久化的兩種方式
      • 3.1 持久化方式1:RDB(redis默認持久化方式)
        • 3.11 配置步驟-自動觸發
        • 3.12 配置步驟-手動觸發
        • 3.12 優點
        • 3.13 缺點
        • 3.14 檢查和修復RDB快照文件
        • 3.15 哪些情況會觸發RDB快照
        • 3.16 如何禁用快照
        • 3.17 RDB優化配置項詳解
      • 3.2 持久化方式2:AOF
        • 3.2.1 AOF持久化工作流程
        • 3.2.2 三種寫回策略
        • 3.2.3 AOF配置說明
        • 3.2.4 AOF文件說明
        • 3.2.5 AOF恢復
        • 3.2.6 AOF文件修復
        • 3.2.7 AOF重寫機制
        • 3.2.8 總結
      • 3.3 持久化方式3:混合模式RDB+AOF
        • 3.3.1 混合模式介紹
        • 3.3.2 開啟混合方式設置
        • 3.3.3 數據的加載流程
      • 3.4 純緩存模式
    • 4. 參考和感謝

1. 什么是持久化

內存中的數據保存到磁盤中

2. 為什么要持久化

Redis持久化可以將內存中的數據保存到硬盤上,保證Redis的數據持久性和可靠性以避免數據在異常情況下丟失和損壞。持久化是保證Redis應用安全的重要手段。

3. 持久化的兩種方式

redis持久化官網介紹

3.1 持久化方式1:RDB(redis默認持久化方式)

RDB(Redis DataBase)模式是Redis的默認持久化模式。它會將Redis在某個時間點上的數據生成一個快照,并將快照以二進制形式保存在磁盤上。RDB模式的優點在于快速且緊湊,適合用于備份和恢復數據。然而,由于定期生成快照的特性,可能會導致在兩次快照之間的數據丟失。

適用場景: 對數據的實時性要求不高,可以接受一定程度的數據丟失,同時對于需要頻繁備份和恢復數據的場景。

3.11 配置步驟-自動觸發
  • 操作步驟:

1.修改5秒2次變更

save 5 2


2.修改快照文件保存路徑(需優先創建:dumpfiles目錄)

dir /myredis/dumpfiles

3.修改快照名稱

dbfilename dump6379.rdb

  1. 重啟redis驗證配置是否成功(略)
127.0.0.1:6379> config get save
1) "save"
2) "5 2"
127.0.0.1:6379> config get dir
1) "dir"
2) "/myredis/dumpfiles"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump6379.rdb"
127.0.0.1:6379>
  • 觸發配置
// 變更兩次,查看是否會生產快照文件
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> 

  • 備份恢復
    • redis 執行flushall也會產生dump文件,不過是空的
    • redis 執行shutdown也會產生dump文件,不過是空的
    • redis 直接重啟就會加載備份的快照文件
3.12 配置步驟-手動觸發
  • save命令

在主程序中執行會阻塞當前redis服務器,直到持久化工作完成執行save命令期間,Redis不能處理其他命令,線上禁止使用

  • bgsave(Background Save)命令(默認)

Redis會使用bgsave對當前內存中的所有數據做快照這個操作是子進程在后臺完成的,這就允許主進程同時可以修改數據

可以通過lastsave命令獲取最后一次成功執行快照的時間

127.0.0.1:6379> lastsave
(integer) 1701683772
127.0.0.1:6379> 
[root@Docker110]# date -d @1701683772
2023年 12月 04日 星期一 17:56:12 CST
3.12 優點
  • 適合大規模的數據恢復按照業務定時備份
  • 對數據完整性和一致性要求不高
  • RDB文件在內存中的加載速度要比 AOF 快得多
3.13 缺點
  • 在一定間隔時間做一次備份,所以如果redis章外down掉的話,就會丟失從當前至最近一次快照期間的數據,快照之間的數據會丟失
  • 內存數據的全量同步,如果數據量太大會導致I/O嚴重影響服務器性能RDB依賴于主進程的fork,在更大的數據集中,這可能會導致服務請求的瞬間延遲。fork的時候內存中的數據被克隆了一分,大致2倍的膨脹性,需要考慮
3.14 檢查和修復RDB快照文件
redis-check-rdb /myredis/dumpfiles/dump6379.rdb

3.15 哪些情況會觸發RDB快照
  • 配置文件中默認的快照配置
  • 手動save/bgsave命令
  • 執行flushall/flushdb命令也會產生dump.rdb文件,但里面是空的,無意義
  • 執行shutdown且沒有設置開啟AOF持久化
  • 主從復制時,主節點自動觸發
3.16 如何禁用快照
  • 命令方式:
redis-cli config set save ""
  • 修改配置文件:
3.17 RDB優化配置項詳解
  • stop-writes-on-bgsave-error


默認yes
如果配置成no,表示你不在乎數據不一致或者有其他的手段發現和控制這種不一致,那么在快照寫入失敗時,
也能確保redis繼續接受新的寫請求
  • rdbcompression

默認yes
對于存儲到磁盤中的快照,可以設置是否進行壓縮存儲。如果是的話,redis會采用LZF算法進行壓縮。
如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能
  • rdbchecksum

默認yes
在存儲快照后,還可以讓redis使用CRC64算法來進行數據校驗,但是這樣做會增加大約10%的性能消耗,如果希望獲取到最大的性能提升,可以關閉此功能
  • rdb-del-sync-files

rdb-del-sync-files:在沒有持久性的情況下刪除復制中使用的RDB文件啟用。默認情況下no,此選項是禁用的。

3.2 持久化方式2:AOF

AOF(Append Only File)模式是另一種常用的持久化模式。它會將每個寫操作都追加到一個日志文件中,從而記錄了Redis的所有操作命令。在恢復數據時,Redis會重新執行這些操作命令以還原數據。AOF模式的優點在于數據的持久化更加可靠,不會丟失任何寫操作。然而,由于需要記錄每一條寫命令,相對于RDB模式,AOF模式的寫入性能較差。

適用場景: 對數據的可靠性要求較高,需要最大程度地避免數據丟失的場景

3.2.1 AOF持久化工作流程

序號描述
1Client作為命令的來源,會有多個源頭以及源源不斷的請求命令。
2在這些命令到達Redis Server以后并不是直接寫入AOF文件,會將其這些命令先放入AOF緩存中進行保存。這里的AOF緩沖區實際上是內存中的一片區域,存在的目的是當這些命令達到一定量以后再寫入磁盤,避免頻繁的磁盤IO操作。
3AOF緩沖會根據AOF緩沖區同步文件的三種寫回策略將命令寫入磁盤上的AOF文件。
4隨著寫入AOF內容的增加為避免文件膨脹,會根據規則進行命令的合并(又稱AOF重寫),從而起到AOF文件壓縮的目的。
5當Redis Server服務器重啟的時候會從AOF文件載入數據。
3.2.2 三種寫回策略
配置項寫回時機優點缺點
Always同步寫回可靠性高,數據基本不丟失每個寫命令都要落盤,性能影響較大
Everysec(默認)每秒寫回性能適中宕機時丟失1秒內的數據
No操作系統控制性能好宕機時丟失數據較多
3.2.3 AOF配置說明
配置指令描述配置示例
appendonly是否開啟AOFappendonly yes
appendfilenameAOF文件名稱appendfilename “appendonly.aof”
dir+appenddirnameAOF文件路徑dir /myredis+“appendonlydir”
appendfsyncAOF同步寫回方式everysec/always/no
no-appendfsync-on-rewriteAOF重寫期間是否同步寫回no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
AOF重寫觸發配置,觸發重寫的比例閾值和最小文件大小閾值;
滿足配置文件中的選項后,Redis會記錄上次重寫時的AOF大小
默認配置是當AOF文件大小是上次rewrite后大小的一倍目文件大于64M時
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
3.2.4 AOF文件說明

Redis7.0 Multi Part AOF的設計
顧名思義,MP-AOF就是將原來的單個AOF文件拆分成多個AOF文件(redis6只有一個文件)。在MP-AOF中,我們將AOF分為三種類型分別為:
它一般由子進程通過重寫產生,該文件最多只有一個

  • BASE: 表示基礎AOF
  • INCR: 表示增量AOF,
    它一般會在AOFRW開始執行時被創建,該文件可能存在多個。
  • HISTORY: 表示歷史AOF,它由BASE和INCR AOF變化而來,每次AOFRW成功完成時本次AOFRW之前對應的BASE和INCR AOF都將變為HISTORY,HISTORY類型的AOF會被Redis自動刪除為了管理這些AOF文件我們引入了一個manifest (清單) 文件來跟蹤、管理這些AOF。同時,為了便于AOF備份和拷貝,我們將所有的AOF文件和manifest文件放入一個單獨的文件目錄中,目錄名由appenddirname配置
    (Redis 7.0新增配置項) 決定。

// 如有下的aof文件存在
1.基本文件
appendonly.aof.1base .rdb
2.增量文件
appendonly.aof.1.incr.aof
appendonly.aof.2.incr.aof
3.清單文件
apendonly.aof.manifest

AOF路徑說明

redis7.0 AOF文件路徑:dir + appenddirname 其中

  • dir是RDB和AOF共用配置參數
  • appenddirname 是redis7新增的aof獨特配置
// 幾種類型文件的前綴,后跟有關序列和類型的附加信息
appendfilename"appendonly.aof
//新版本增加的目錄配置項目
appenddirname "appendonlydir"
3.2.5 AOF恢復

采用 flushdb + shutdown模擬redis異常終止,需要注意的是:

  • flushdb也是寫操作,也會寫入aof文件,所以在執行flushdb之前備份aof文件,flushdb之后可以使用 備份的aof 覆蓋掉aof文件
  • 也可以不備份,在執行完flushdb + shutdown操作之后,手動刪除增量文件中的最后flushdb命令
  • 為了防止RDB文件的干涉,重啟之前刪除RDB文件,或者模擬整個過程中關閉RDB持久化

最后,重啟reids便可加載aof文件進行數據恢復

3.2.6 AOF文件修復

故意破環aof增量文件

[root@Docker110 appendonlydir]# vim appendonly.aof.1.incr.aof 
*2
$6
......
$1
0
jasitfgjwaior943q294r534jiosa(*(u

重啟啟動之后查看

居然啟動失敗,趕緊查看一下日志,日志文件

日志文件路徑的配置

建議讓我們修復一下aof文件

再次啟動,成功恢復

3.2.7 AOF重寫機制

AOF 文件的不斷增長可能會導致性能問題。為了解決這個問題,Redis 實現了 AOF 重寫機制。AOF 重寫是一種優化技術,通過在后臺進程中重構 AOF 文件的數據,來減小 AOF 文件的大小。
啟動AOF文件的內容壓縮,只保留可以恢復數據的最小指令集

也就是說 AOF 文件重寫并不是對原文件進行重新整理,而是直接讀取服務器現有的鍵值對,
然后用一條命令去代替之前記錄這個鍵值對的多條命令,生成一個新的文件后去替換原來的 AOF 文件。
AOF 文件重寫觸發機制: 過 redis.conf 配置文件中的 auto-aofrewrite-percentage: 默認值為100,以及auto-aofrewritemin-size: 64mb 配置,
也就是說默認Redis會記錄上次重寫時的AOF大小,默認配置是當AOF文件大小是上次rewrite后大小的一倍目文件大于64M時觸發
  • 重寫機制的配置

注意 ,同時滿足,且的關系才會觸發
1 根據上次重寫后的aof大小,判斷當前aof大小是不是增長了1倍
2 重寫時滿足的文件大小
  • 觸發方式
1. 自動觸發:滿足重寫機制配置條件,就會自動后臺執行重寫,也就是壓縮aof
2. 手動觸發: 客戶端向服務器發送 bgrewriteaof 命令
  • 重寫原理
1.AOF 重寫機制的原理是根據 Redis 進程內的數據生成一個新的 AOF 文件,只包含當前有效和存在的數據的寫入命令,而不是歷史上所有的寫入命令 。
2.AOF 重寫機制是通過 fork 出一個子進程來完成的,子進程會掃描 Redis 的數據庫,并將每個鍵值對轉換為相應的寫入命令,然后寫入到一個臨時文件中 。
3.在子進程進行 AOF 重寫的過程中,主進程還會繼續接收和處理客戶端的請求,如果有新的寫操作發生,主進程會將這些寫操作追加到一個緩沖區中,并通過管道通知子進程 。
4.子進程在完成 AOF 重寫后,會將緩沖區中的寫操作也追加到臨時文件中,然后向主進程發送信號,通知主進程可以切換到新的 AOF 文件了 。
5.主進程在收到子進程的信號后,會將緩沖區中的寫操作再次追加到臨時文件中(以防止在此期間有新的寫操作發生),然后用臨時文件替換舊的 AOF 文件,并關閉舊的 AOF 文件 
  • 驗證
文件大小調整為 1k 方便驗證

反復多次設置k1

查看增量aof內容的的變化、aof文件名稱以及大小的變化

可以清晰的看到重寫之后的變化:

  1. base基礎aof由0變成130、增量aof由384變成0、清單aof沒有變化,整體大小進行了壓縮
  2. 文件序號由1變成了
3.2.8 總結

更好的保護數據不丟失 、性能高、可做緊急恢復相同數據集的數據而言aof文件要遠大于rdb文件,恢復速度慢于rdbaof運行效率要慢于rdb,每秒同步策略效率較好,不同步效率和rdb相同

3.3 持久化方式3:混合模式RDB+AOF

3.3.1 混合模式介紹

我們首先看看官網對混合模式的介紹:

一般來說,如果你想要一個與PostgreSQL相媲美的數據安全程度,你應該使用這兩種持久化方法。RDB鏡像做全量持久化,AOF做增量持久化
結合了RDB和AOF的優點,既能快速加載又能避免丟失過多的數據

3.3.2 開啟混合方式設置
設置aof-use-rdb-preamble的值為 yes   yes表示開啟,設置為no表示禁用

先使用RDB進行快照存儲,然后使用AOF持久化記錄所有的寫操作,當重寫策略滿足或手動觸發重寫的時候,將最新的數據存儲為新的RDB記錄。這樣的話,重啟服務的時候會從RDB和AOF兩部分恢復數據,既保證了數據完整性,又提高了恢復數據的性能。
簡單來說:混合持久化方式產生的文件一部分是RDB格式,一部分是AOF格式(AOF包括了RDB頭部+AOF混寫)

3.3.3 數據的加載流程

在同時開啟rdb 和aof 持久化時,重啟時只會加載 aof 文件,不會加載 rdb 文件,rdb做為一個萬一的策略

3.4 純緩存模式

同時關閉RDB+AOF

  • 禁用RDB(save "")
    禁用RDB持久化模式下,我們仍然可以使用命令save、bgsave生成rdb文件
  • 禁用AOF(appendonly no)
    禁用AOF持久化模式下,我們仍然可以使用命令bgrewriteaof生成aof文件

4. 參考和感謝

尚硅谷Redis零基礎到進階,最強redis7教程,陽哥親自帶練

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

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

相關文章

每天一個Linux命令 -- (7)more命令

歡迎閱讀《每天一個Linux命令》系列!在本篇文章中,將介紹Linux系統下的more命令,它用于逐屏顯示文件的內容。 概念 more命令是Linux系統下的文件逐屏顯示命令,用于逐屏顯示文件的內容。 命令操作 more命令的語法如下&#xff1…

ubuntu22.04 安裝cuda

CUDA(Compute Unified Device Architecture)是由 NVIDIA 開發的一種并行計算平臺和編程模型。它允許開發者利用 NVIDIA 的 GPU(圖形處理單元)進行高效的計算處理。CUDA 通過提供一系列的 C、C 和 Fortran 擴展,使得開發…

我的NPI項目之Android電源系列 -- 關于剩余充滿時間的問題(一)

我的新項目是基于高通最新的5G平臺,但是由于還沒有拿到EVT。所以,就在目舊的平臺和OS上進行學習。遇到第一個問題就是插上type-c之后,充滿剩余時間異常的問題。 問題描述,在充電過程中,顯示充滿時間為“0 min left unt…

9.基于SpringBoot3+I18N實現國際化

1. 新建資源文件 在resources目錄下新建目錄i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帳戶或密碼錯誤!2. 新建LocaleConfig.java文件 Configurati…

2004-2021年上市公司環境規制強度相關數據

2004-2021年上市公司環境規制強度相關數據 1、時間:2004-2021年 2、指標:年份、股票代碼、股票簡稱、行業名稱、行業代碼、省份、城市、區縣、行政區劃代碼、城市代碼、區縣代碼、首次上市年份、上市狀態、所屬省份-工業增加值_億元、所屬省份-治理廢氣…

Flink流批一體計算(24):Flink SQL之mysql維表實時關聯

目錄 1.維表 2.數據準備 創建源數據 創建維度表 創建Sink表 3.配置任務 Flink SQL創建kafka源表 Flink SQL創建MySQL維表 Flink SQL創建MySQL結果表 編寫計算任務 核驗數據 1.維表 目前在實時計算的場景中,大多數都使用過MySQL、Hbase、redis作為維表引擎…

PTA:計算總分

題干 請編寫一個函數sum,函數的功能是:計算一個由結構體表示的包含多門課程成績組成的學生的總成績。 函數接口定義: double sumScore(struct student stu); 其中 stu是用戶傳入的參數。函數須返回學生的總成績。 裁判測試程序樣例&#x…

【華為數據之道學習筆記】3-7 報告數據治理

報告數據是指對數據進行處理加工后,用作業務決策依據的數據。它用于支持報告和報表的生成。 用于報告和報表的數據可以分為如下幾種。 用于報表項數據生成的事實表、指標數據、維度。 用于報表項統計和計算的統計函數、趨勢函數及報告規則。 用于報表和報告展示的…

AVFormatContext編解碼層:理論與實戰

文章目錄 前言一、FFmpeg 解碼流程二、FFmpeg 轉碼流程三、編解碼 API 詳解1、解碼 API 使用詳解2、編碼 API 使用詳解 四、編碼案例實戰1、示例源碼2、運行結果 五、解碼案例實戰1、示例源碼2、運行結果 前言 AVFormatContext 是一個貫穿始終的數據結構,很多函數都…

前后端分離項目跨域請求

一、前端vue項目 在項目中創建request.js文件,添加以下內容 import axios from "axios"; const api axios.create({ //這里配置的是后端服務提供的接口baseURL: "http://localhost:8080/web-demo",timeout: 1000} ); export default api; …

基于HSV空間色彩的圖像分割方法(含python代碼實現)

文章目錄 1. 介紹2. HSV顏色空間3. python實現HSV圖像分割3.1. 代碼實現3.2. 運行結果 1. 介紹 HSV顏色系統簡介: HSV 即使用色相(Hue)、飽和度(Saturation)、明度(Value)來表示色彩的一種方式…

HttpComponents: 領域對象的設計

1. HTTP協議 1.1 HTTP請求 HTTP請求由請求頭、請求體兩部分組成,請求頭又分為請求行(request line)和普通的請求頭組成。通過瀏覽器的開發者工具,我們能查看請求和響應的詳情。 下面是一個HTTP請求發送的完整內容。 POST https://track.abc.com/v4/tr…

根據對數器找規律、根據數據量猜題目解法

題目一 小虎去買蘋果,商店只提供兩種類型的塑料袋,每種類型都有任意數量。1)能裝下6個蘋果的袋子2)能裝下8個蘋果的袋子小虎可以自由使用兩種袋子來裝蘋果,但是小虎有強迫癥,他要求自己使用的袋子數量必須…

python門戶網站文件爬取并顯示

廣西南寧政府門面網站 import requests import os import io import numpy as np from concurrent.futures import ThreadPoolExecutor from bs4 import BeautifulSoup import time import pdfplumber import pandas as pd from docx import Document import docx import win32…

WordCount 源碼解析 Mapper,Reducer,Driver

創建包 com.nefu.mapreduce.wordcount ,開始編寫 Mapper , Reducer , Driver 用戶編寫的程序分成三個部分: Mapper 、 Reducer 和 Driver 。 ( 1 ) Mapper 階段 ? 用戶自定義的 Mapper 要繼承自己的父…

文件服務器搭建

文件服務器搭建 文件服務器有四個選擇: httpd(apache) 穩定,使用廣泛,服務器一般自帶,對于開發人員來說強烈推薦。 nginx 穩定高效,使用廣泛,linux命令可直接下載,對…

STM32CubeIDE串口空閑中斷實現不定長數據接收

STM32F051空閑中斷實現串口不定長數據接收 目的編程軟件配置串口開中斷中斷程序運行結果目的 在串口輸入不定長數據時,通過串口空閑中斷來斷幀接收數據。 編程軟件 STM32CubeIDE STM32CubeMX配置MCU。通過對端口配置,自動生成程序,減少編程量。 配置串口開中斷 配置串口…

redis中序列化問題,value包含全路徑類名解析

1. 問題 redis中保存的key-value格式 value直接存入的是實體對象,值中包含全路徑類名,在使用Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer解析器時報錯 報錯內容: com.fasterxml.jackson.databind.exc.InvalidTypeI…

《師兄啊師兄》第二季確認定檔!海神揚名,穩健回歸!

近日,《師兄啊師兄》第二季的定檔海報和PV終于發布,確認將于12月14日上午10點強勢回歸!這部備受矚目的國漫作品自第一季播出以來,便以其獨特的劇情設定和唯美的畫風,贏得了廣大觀眾的喜愛。如今,動畫第二季…

第一課【習題】給應用添加通知和提醒

構造進度條模板通知,name字段當前需要固定配置為downloadTemplate。 給通知設置分發時間,需要設置showDeliveryTime為false。 OpenHarmony提供后臺代理提醒功能,在應用退居后臺或退出后,計時和提醒通知功能被系統后臺代理接管…