常見面試題-Redis持久化策略

談談Redis 的持久化策略?

參考文章:

  • Redis 持久化機制演進與百度智能云的實踐

Redis的確是將數據存儲在內存的,但是也會有相關的持久化機制將內存持久化備份到磁盤,以便于重啟時數據能夠重新恢復到內存中,避免數據丟失的風險。而Redis持久化機制有三種:AOFRDB混合型持久化(4.x版本后提供)

  • RDB持久化

    關閉 RDB 持久化只需要將 save 保存策略注釋掉即可

    RDB持久化的方式有兩種:

    • 手動觸發(分為手動 save 和手動 bgsave)

      • 手動save:阻塞當前 Redis,直到持久化完成,可能造成長時間阻塞,線上不建議使用。?

      • 手動bgsave:Redis 進程執行 fork 創建子進程進行持久化,阻塞事件很短。在執行Redis-cli shutdown關閉Redis服務時或執行flushall命令時,如果沒有開啟AOF持久化,自動執行bgsave

    • 被動觸發(以下四種情況會被動觸發)

      • 達到了在 redis.conf 中配置被動觸發的條件,會觸發 bgsave 生成 rdb 文件

        Redis 中 save 操作的配置:從右向左條件主鍵變弱,如果60s發生了10000次寫操作,就進行持久化,如果沒有達到,在300s時,如果有100次寫操作就會持久化,如果沒有達到在3600s,如果有一次寫操作就會持久化

        在這里插入圖片描述

      • 主從復制時,從節點需要全量同步主節點的數據,會觸發 bgsave

      • 執行 debug reload 命令重新加載 redis 時,會觸發 bgsave

      • 執行 shutdown 命令時,如果沒有開啟 aof 持久化,會觸發 bgsave

    ?

    bgsave子進程工作原理:

    由子進程繼承父進程所有資源,且父進程不能拒絕子進程繼承,bgsave子進程先將內存中的全量數據copy到磁盤的一個RDB臨時文件,持久化完成后將該臨時文件替換原來的dump.rdb文件。

    如果持久化過程中出現了新的寫請求,則系統會將內存中發生數據修改的物理塊copy出一個副本,bgsave 子進程會把這個副本數據寫入 RDB 文件,在這個過程中,主線程仍然可以直接修改原來的數據,fork 使用了 寫時復制技術(Copy-On-Write)

    ?

    操作系統中的寫時復制技術:

    目的:是避免不必要的內存拷貝。

    在Linux系統中,調用 fork 系統調用創建子進程時,并不會把父進程所有占用的內存頁復制一份,而是與父進程共用相同的內存頁,而當子進程或者父進程對內存頁進行修改時才會進行復制 —— 這就是著名的 寫時復制 機制。

    那么bgsave中的寫時復制技術即如果在持久化過程中,寫入了新的數據,此時再去將元數據重新拷貝一份,進行修改。

    ?

    優點:

    • 使用單獨子進程持久化,保證 redis 高性能。
    • RDB 持久化存儲壓縮的二進制文件,適用于備份、全量復制,可用于災難備份,同時RDB文件的加載速度遠超于AOF文件。

    缺點:

    • 沒有實時持久化,可能造成數據丟失。
    • 備份時占用內存,因為Redis 在備份時會獨立創建一個子進程,將數據寫入到一個臨時文件(需要的內存是原本的兩倍)
    • RDB文件保存的二進制文件存在新老版本不兼容的問題。
  • AOF持久化

    默認AOF沒有開啟,可在redis.conf中配置

    在這里插入圖片描述

    Redis7發生了重大變化,原來只有一個appendonly.aof文件,現在具有了三類多個文件:

    • 基本文件:RDB格式或AOF格式。存放RDB轉為AOF當時內存的快照數據。該文件可以有多個。
    • 增量文件:以操作日志形式記錄轉為AOF后的寫入操作。該文件可以有多個。
    • 清單文件:維護AOF文件的創建順序,保證激活時的應用順序。該文件只可以有1個。

    ?

    aof 文件中存儲的 resp 協議數據格式,如果執行命令set a hello,aof文件內容如下:(*3代表有3條命令,$5代表有5個字符)

    *3
    $3
    set
    $1
    a
    $5
    hello
    

    AOF持久化時,其實是先寫入緩存中,之后再同步到磁盤中,同步策略有三種:

    • appendfsync always:每次寫入都同步到磁盤,最安全,但影響性能。
    • appendfsync everysec(推薦、默認配置):每秒同步一次,最多丟失1秒的數據。
    • appendfsync noRedis并不直接調用文件同步,而是交給操作系統來處理,操作系統可以根據buffer填充情況/通道空閑時間等擇機觸發同步;這是一種普通的文件操作方式。性能較好,在物理服務器故障時,數據丟失量會因OS配置有關。

    優點:

    • 數據丟失風險較低,后臺線程處理持久化,不影響客戶端請求處理的線程。

    缺點:

    • 文件體積由于保存的是所有命令會比RDB大上很多,而且數據恢復時也需要重新執行指令,在重啟時恢復數據的時間往往會慢很多。

    AOF的重寫(Rewrite)機制:

    • 為了防止AOF文件太大占用大量磁盤空間,降低性能,Redis引入了Rewrite機制對AOF文件進行壓縮

      Rewrite就是對AOF文件進行重寫整理。當開啟Rewrite,主進程redis-server創建出一個子進程bgrewriteaof,由該子進程完成rewrite過程。

      首先會對現有aof文件進行重寫,將計算結果寫到一個臨時文件,寫入完畢后,再重命名為原aof文件,進行覆蓋。

    ?

    配置AOF重寫頻率

    # auto‐aof‐rewrite‐min‐size 64mb //aof文件至少要達到64M才會自動重寫,文件太小恢復速度本來就很快,重寫的意義不大
    # auto‐aof‐rewrite‐percentage 100 //aof文件自上一次重寫后文件大小增長了100%則再次觸發重寫
    

    AOF的持久化流程圖:

在這里插入圖片描述

?

  • 混合持久化開啟

    默認開啟,即AOF持久化的基本文件時的基本文件是RDB格式的。(必須先開啟aof)

    在這里插入圖片描述

    混合持久化重寫aof文件流程:aof 在重寫時,不再將內存數據轉為 resp 數據寫入 aof 文件,而是將之前的內存數據做 RDB 快照處理,將 RDB快照+AOF增量數據 存在一起寫入新的 AOF 文件,完成后覆蓋原有的 AOF 文件。

    ?

    Redis重啟加載數據流程:

    1. 先加載 RDB 數據到內存中
    2. 再重放增量 AOF 日志,加載 AOF 增量數據

    優點:

    • 結合了 RDB 和 AOF,既保證了重啟 Redis 的性能,又降低數據丟失風險

    缺點:

    • AOF 文件中添加了 RDB 格式的內容,使得 AOF 文件的可讀性變得很差;

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

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

相關文章

【Python 千題 —— 基礎篇】奇數列表

題目描述 題目描述 創建奇數列表。使用 for 循環創建一個包含 20 以內奇數的列表。 輸入描述 無輸入。 輸出描述 輸出創建的列表。 示例 示例 ① 輸出: 創建的奇數列表為: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]代碼講解 下面是本題的代碼: #…

9. 回文數 --力扣 --JAVA

題目 給你一個整數 x ,如果 x 是一個回文整數,返回 true ;否則,返回 false 。 回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 例如,121 是回文&#xff0…

二、爬蟲-爬取肯德基在北京的店鋪地址

1、算法框架解釋 針對這個案例,現在對爬蟲的基礎使用做總結如下: 1、算法框架 (1)設定傳入參數 ~url: 當前整個頁面的url:當前頁面的網址 當前頁面某個局部的url:打開檢查 ~data:需要爬取數據的關鍵字&…

DB2中實現數據字段的拼接(LISTAGG() 與 xml2clob、xmlagg)

DB2中實現數據字段拼接(LISTAGG 與 xml2clob、xmlagg) 1. 使用函數LISTAGG()1.1 同oracle實現方式1.2 DB2中使用LISTAGG()1.2.1 關于DB2版本1.2.2 數據準備1.2.3 代碼實現 2 解決DB2中關于 LISTAGG() 超長問題2.1 使用xmlagg xmlelement2.2 將xml標簽去…

數據結構與算法編程題11

已知兩個鏈表A和B分別表示兩個集合&#xff0c;其元素遞增排列。 請設計算法求出A與B的交集&#xff0c;并存放于A鏈表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…

【iOS】實現評論區展開效果

文章目錄 前言實現行高自適應實現評論展開效果解決cell中的buttom的復用問題 前言 在知乎日報的評論區中&#xff0c;用到了Masonry行高自適應來實現評論的展開&#xff0c;這里設計許多控件的約束問題&#xff0c;當時困擾了筆者許久&#xff0c;特此撰寫博客記錄 實現行高自…

如何構建更簡潔的前端架構?

目錄 為什么需要前端架構&#xff1f; 那么&#xff0c;前端架構是什么樣的呢&#xff1f; 使用了哪些層&#xff1f; 那么&#xff0c;這種架構會出什么問題呢&#xff1f; 我們應該如何避免這些錯誤&#xff1f; 哪些原則應適用于組件&#xff1f; Anti-Patterns 反模…

小程序存在優惠卷遍歷,但是歪了

進入小程序&#xff0c;因為是一個小商城&#xff0c;所以照例先查看收貨地址是否存在越權&#xff0c;以及能否未授權訪問&#xff0c;但是發現不存在這些問題&#xff0c;所以去查看優惠卷 進入領券中心&#xff0c;點擊領取優惠券時抓包 發現數據包&#xff0c;存在敏感參數…

數據庫的級聯刪除

級聯刪除是指在數據庫中刪除一個對象時&#xff0c;與該對象有關的其他對象也被自動刪除。在 Django 中&#xff0c;級聯刪除通常通過在模型中定義外鍵時使用 on_delete 參數來實現。以下是一些常見的 on_delete 選項&#xff1a; 1.models.CASCADE: 當關聯的對象被刪除時&…

CentOS 7 使用Fmt庫

安裝 fmt Git下載地址&#xff1a;https://github.com/fmtlib/fmt 步驟1&#xff1a;首先&#xff0c;你需要下載fmt的源代碼。你可以從https://github.com/fmtlib/fmt或者源代碼官方網站下載。并上傳至/usr/local/source_code/ ? 步驟2&#xff1a;下載完成后&#xff…

【Docker】Docker安裝Nginx配置靜態資源

1.下載鏡像 2.創建nginx配置文件 3.創建nginx容器運行 4.配置nginx靜態資源 1.下載鏡像 Dockerhub官網&#xff1a;Docker docker pull nginx docker pull nginx下載最新版本 默認latest 下載指定版本docker pull nginx:xxx 2.創建nginx配置文件 啟動容器之前要創建nginx…

怎么使用sentinel,以及所有的知識點

Sentinel是一個開源的流量控制和實時監控系統&#xff0c;主要用于保護企業級應用程序免受不良的請求。下面是使用Sentinel需要了解的知識點&#xff1a; 1. 什么是流量控制&#xff1f; 流量控制指的是限制應用程序的請求流量&#xff0c;防止過多的請求超出系統的承受范圍。…

基于單片機停車場環境監測系統仿真設計

**單片機設計介紹&#xff0c; 基于單片機停車場環境監測系統仿真設計 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于單片機的停車場環境監測系統是一種利用單片機技術實現環境監測和數據處理的系統。它可以感知停車場的溫濕…

Python (十一) 迭代器與生成器

迭代器 迭代器是訪問集合元素的一種方式&#xff0c;可以記住遍歷的位置的對象 迭代器有兩個基本的方法&#xff1a;iter() 和 next() 字符串&#xff0c;列表或元組對象都可用于創建迭代器 字符串迭代 str1 Python str_iter iter(str1) print(next(str_iter)) print(next(st…

zip4j壓縮使用總結

一、引入依賴 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.1</version></dependency>二、使用添加文件&#xff08;addFiles&#xff09;的方式生成壓縮包 /*** Author wan…

藍橋杯物聯網_STM32L071_2_繼電器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

HarmonyOS應用開發者認證題目滿分指南

為了幫助大家快速的上手HarmonyOS應用程序開發&#xff0c;官方制作了一些免費的課程&#xff1a;HarmonyOS第一課。每個課程后面都有一些練習題&#xff0c;下面就是這些題目的滿分答案。 【習題】運行Hello World工程 判斷題 1.DevEco Studio是開發HarmonyOS應用的一站式集…

定時器如何計算觸發頻率?

定時器觸發頻率的計算公式為&#xff1a;定時器時鐘頻率/&#xff08;預分頻系數*計數周期1&#xff09;。其中&#xff0c;定時器時鐘頻率是指定時器所連接的總線頻率&#xff0c;預分頻系數和計數周期需要根據具體的需求進行設置。預分頻系數用于將總線頻率分頻&#xff0c;計…

Power Apps-下拉列表控件

插入一個下拉列表控件 設置值的兩種方式 1.通過屬性items寫數組設置 2.通過連接數據表&#xff0c;先在右側操作面板中選擇項目中的數據表 再從Value中選擇其中一列&#xff0c;下拉就可以選擇該列全部行的值 但是這樣會導致有很多重復的字段&#xff0c;所以可以在items屬性里…

好用的博客評論系統 Valine 使用及避坑指南

評論系統&#xff0c;即網站的一個小功能&#xff0c;展示評論內容和用戶輸入框。開源免費的評論系統可不多&#xff0c;原來很火的"多說"評論系統都關閉了&#xff0c;而Disqus又是國外的訪問受限。無意間發現了Valine&#xff0c;挺不錯的&#xff0c;分享給大家。…