[AIGC] redis 持久化相關的幾道面試題

文章目錄

      • 1. 什么是Redis持久化?
      • 2. Redis 的持久化機制是什么?各自的優缺點?
        • 2.1 RDB(Redis DataBase),快照
        • 2.2 AOF(Append Only File),日志
      • 3. 優缺點是什么?
      • 4. 如何選擇合適的持久化方式
      • 5. Redis持久化數據和緩存怎么做擴容?
      • 6. Redis 怎么確保 Aof 不丟失
      • 7. Aof 日志是寫前還是寫后日志
      • 8. AOF為什么要先執行命令再記日志
      • 9. Redis Aof 的風險

1. 什么是Redis持久化?

持久化就是把內存的數據寫到磁盤中去,防止服務宕機了內存數據丟失。

2. Redis 的持久化機制是什么?各自的優缺點?

Redis 提供兩種持久化機制 RDB(默認) 和 AOF 機制。

2.1 RDB(Redis DataBase),快照

RDB是Redis默認的持久化方式。按照一定的時間將內存的數據以快照的形式保存到硬盤中,對應產生的數據文件為 dump.rdb。通過配置文件中的save參數來定義快照的周期。
image.png
優點:

    1. 只有一個文件 dump.rdb,方便持久化。
    1. 容災性好,一個文件可以保存到安全的磁盤。
    1. 性能最大化,fork 子進程來完成寫操作,讓主進程繼續處理命令,所以是 IO 最大化。使用單獨子進程來進行持久化,主進程不會進行任何 IO 操作,保證了 redis 的高性能
    1. 相對于數據集大時,比 AOF 的啟動效率更高。

缺點:

    1. 數據安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生數據丟失。所以這種方式更適合數據要求不嚴謹的時候)
2.2 AOF(Append Only File),日志

AOF持久化(即Append Only File持久化),則是將Redis執行的每次寫命令記錄到單獨的日志文件中,當重啟Redis會重新將持久化的日志中文件恢復數據。

所有的命令行記錄以 redis 命令請 求協議的格式完全持久化存儲)保存為 aof 文件。

當兩種方式同時開啟時,數據恢復Redis會優先選擇AOF恢復。
image.png
優點:

  • 1、數據安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次 命令操作就記錄到 aof 文件中一次。
  • 2、通過 append 模式寫文件,即使中途服務器宕機,可以通過 redis-check-aof 工具解決數據一致性問題。
  • 3、AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 之前(文件過大時會對命令 進行合并重寫),可以刪除其中的某些命令(比如誤操作的 flushall))

缺點:

  • 1、AOF 文件比 RDB 文件大,且恢復速度慢。
  • 2、數據集大的時候,比 rdb 啟動效率低。

3. 優缺點是什么?

  • AOF文件比RDB更新頻率高,優先使用AOF還原數據。
  • AOF比RDB更安全也更大
  • RDB性能比AOF好
  • 如果兩個都配了優先加載AOF

4. 如何選擇合適的持久化方式

  • 如果極度關心數據安全性,你應該同時使用兩種持久化功能。在這種情況下,當 Redis 重啟的時候會優先載入AOF 文件來恢復原始的數據,因為在通常情況下AOF文件保存的數據集要比RDB文件保存的數據集要完整。
  • 如果非常關心你的數據, 但仍然可以承受數分鐘以內的數據丟失,那么你可以只使用RDB持久化。
  • 如果你只希望你的數據在服務器運行的時候存在,你也可以不使用任何持久化方式。
  • 有很多用戶都只使用 AOF 持久化,但并不推薦這種方式,因為定時生成 RDB 快照(snapshot)非常便于進行數據庫備份, 并且 RDB 恢復數據集的速度也要比AOF恢復的速度要快,除此之外,使用 RDB 還可以避免 AOF 程序的 bug 。

5. Redis持久化數據和緩存怎么做擴容?

  • 如果Redis被當做緩存使用,使用一致性哈希實現動態擴容縮容。
  • 如果Redis被當做一個持久化存儲使用,必須使用固定的 keys-to-nodes 映射關系,節點的數量一旦確定不能變化。否則的話( 即Redis節點需要動態變化的情況 ),必須使用可以在運行時進行數據再平衡的一套系統,而當前只有Redis集群可以做到這樣。

6. Redis 怎么確保 Aof 不丟失

首先,要 AOF完全不丟失,是不可能的,因為 aof 的寫回策略只有三種,always,everySec, no,就算啟用的是 always,由于 redis 是寫后日志,當數據寫入成功的瞬間,redis 實例宕機了,依然會導致 aof 丟失,但是此時,redis 沒有響應,所以可以認為 aof 不曾丟失(因為業務沒有成功響應)。

7. Aof 日志是寫前還是寫后日志

說到日志,我們比較熟悉的是數據庫的寫前日志(Write Ahead Log, WAL),也就是說,在實際寫數據前,先把修改的數據記到日志文件中,以便故障時進行恢復。不過,AOF日志正好相反,它是寫后日志,“寫后”的意思是Redis是先執行命令,把數據寫入內存,然后才記錄日志。

8. AOF為什么要先執行命令再記日志

要回答這個問題,我們要先知道AOF里記錄了什么內容。

傳統數據庫的日志,例如redo log(重做日志),記錄的是修改后的數據,而AOF里記錄的是Redis收到的每一條命令,這些命令是以文本形式保存的。

我們以Redis收到“ set testkey testvalue ”命令后記錄的日志為例,看看 AOF 日志的內容。其中,“*3”表示當前命令有三個部分,每部分都是由“$+數字”開頭,后面緊跟著具體的命令、鍵或值。這里,“數字”表示這部分中的命令、鍵或值一共有多少字節。例如,“$3 set”表示這部分有3個字節,也就是“set”命令。


最重要的原因是 Redis 作為一個內存數據庫追求極致的性能。
為了避免額外的檢查開銷,Redis在向AOF里面記錄日志的時候,并不會先去對這些命令進行語法檢查。所以,如果先記日志再執行命令的話,日志中就有可能記錄了錯誤的命令,Redis在使用日志恢復數據時,就可能會出錯。
而寫后日志這種方式,就是先讓系統執行命令,只有命令能執行成功,才會被記錄到日志中,否則,系統就會直接向客戶端報錯。所以,Redis使用寫后日志這一方式的一大好處是,可以避免出現記錄錯誤命令的情況。
除此之外,AOF還有一個好處:它是在命令執行后才記錄日志,所以不會阻塞當前的寫操作。

9. Redis Aof 的風險

AOF也有兩個潛在的風險。
首先,如果剛執行完一個命令,還沒有來得及記日志就宕機了,那么這個命令和相應的數據就有丟失的風險。如果此時Redis是用作緩存,還可以從后端數據庫重新讀入數據進行恢復,但是,如果Redis是直接用作數據庫的話,此時,因為命令沒有記入日志,所以就無法用日志進行恢復了。
其次,AOF雖然避免了對當前命令的阻塞,但可能會給下一個操作帶來阻塞風險。這是因為,AOF日志也是在主線程中執行的,如果在把日志文件寫入磁盤時,磁盤寫壓力大,就會導致寫盤很慢,進而導致后續的操作也無法執行了。
仔細分析的話,你就會發現,這兩個風險都是和AOF寫回磁盤的時機相關的。這也就意味著,如果我們能夠控制一個寫命令執行完后AOF日志寫回磁盤的時機,這兩個風險就解除了。

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

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

相關文章

Vue3的setup

Vue3的setup setup選項是一個接收props和context的函數是一個新的組件選項,作為Composition-API的入口點,只會被執行一次,用于建立數據與邏輯的連接。 注意點 在執行setup函數時,還沒執行created生命周期方法,因此在s…

單核CPU調度

CPU MLFQ 調度 MLFQ即多級反饋隊列調度。在給定時間片中,任務存在不同優先隊列之中等待被執行,MLFQ根據優先級去決定哪個任務在該時間片執行 Round Robin Round Robin即RR,是基于時間片的輪詢調度算法。給每個任務分配一個時間片&#xff…

pixhawk無人機飛控解鎖

飛控解鎖 GitBook 左手油門的遙控解鎖是油門右下角撥,右手油門是油門最低,方向最右。 飛控如何加鎖? 左手油門:油門左下角 右手油門:油門最低,方向最左 飛控解鎖成功后,不推油門的情況下,…

基于SSM+Vue的物流管理系統

運行截圖 獲取方式 Gitee倉庫

大眾點評全國店鋪基礎信息采集-學習培訓店鋪-2024年5月

2024年5月最新采集大眾點評全國(內地)-學習培訓大類-店鋪基礎信息,93余萬家 學習培訓類店鋪示例: 店鋪id k40VtNBN3bixFJIU 店鋪名稱 夢想鋼琴成人鋼琴(珠江新城總部) 十分制效果評分 9.4 十分制服務評分 9.4 十分制環境評分 9.4 人均價格 1233 …

為什么數據庫字符編碼不一致會導致索引失效

引言 數據庫字符編碼不一致是數據庫管理和優化過程中經常遇到的問題之一,尤其在涉及多語言環境和多應用時更為顯著。本文旨在深入探討字符編碼不匹配如何影響SQL查詢性能,導致索引失效,以及其背后的原理。 1. 字符編碼與索引基礎 字符編碼…

【TypeScript模塊簡介以及使用方法】

TypeScript模塊簡介 TypeScript中的模塊(Modules)是代碼的封裝體,它們可以包含變量、函數、類和接口等。在TypeScript中,模塊可以被其他模塊引用和使用,從而實現代碼的復用和模塊化開發。 TypeScript支持兩種模塊系統…

LORA學習筆記2——訓練集處理

前言 對于ai訓練來說,處理訓練集是模型訓練的重要環節。訓練集的質量對最終模型的質量影響巨大。這里以二次元角色為例,記錄下訓練集處理的流程和一些心得。 素材準備 素材準備有以下幾個需要注意的點: 通常訓練二次元角色需要30張以上的…

14:HAL---CRC校驗

103系列只有一個CRC 前言: CRC(Cyclic Redundancy Check),即循環冗余校驗,是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校核碼的快速算法,主要用來檢測或校核數據傳輸或者保存后可能出現的錯誤。…

QX---mini51單片機學習---(8)8*8點陣屏

目錄 1LED點陣屏簡紹 2 8*8點陣屏電路圖74 3 74HC595芯片 4實踐編程 1LED點陣屏簡紹 2 8*8點陣屏電路圖74 怎么點亮,正極給高負極給低 不能同時靜態顯示,跟數碼管動態顯示一樣,反復橫跳,利用視覺效果 3 74HC595芯片 …

斐波那契數

509. 斐波那契數 斐波那契數 (通常用 F(n) 表示)形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 …

第四屆上海理工大學程序設計全國挑戰賽---昨日方舟

知識點:模擬 題目描述 《昨日方舟》是一款塔防類游戲。在游戲中,我們要通過部署角色來抵御怪物的入侵。在這款游戲中,有一名角色名字為 “今”,他的能力為能夠在地圖上部署小蛇,小蛇在某些條件下可以與其他小蛇合體…

關于 IIS 開啟匿名訪問網站仍要賬號密碼登錄網站的解決方法

歡迎關注公總號【云邊小網安】 問題提出:發現雖然勾選了允許匿名訪問網站,但在訪問某一網站的時候仍然需要登錄賬號密碼 解決方法一:登錄管理員賬號密碼解決方法二:添加訪問網站文件夾的用戶 訪問某一網站本質上來講&#xff0…

C++入門必讀-Qt的安裝與配置

QT簡介 Qt是一個跨平臺的C圖形用戶界面應用程序框架。它為應用程序開發者提供建立圖形界面所需的所有功能。它是完全面向對象的,很容易擴展,并且允許真正的組件編程。 QT下載 訪問下載網站: Index of /archive/qt 安裝編譯器 QT安裝 建議安裝之前將網絡斷…

1064 朋友數

solution 給出n個整數&#xff0c;統計可能的位數和&#xff0c;并按升序輸出&#xff08;考慮用set實現&#xff09; #include<iostream> #include<set> using namespace std; int main(){set<int> st;int n, x, sum;scanf("%d", &n);while…

前端Vue架構

1 理解&#xff1a; 創建視圖的函數&#xff08;render&#xff09;和數據之間的關聯&#xff1b; 當數據發生變化的時候&#xff0c;希望render重新執行&#xff1b; 監聽數據的讀取和修改&#xff1b; defineProperty&#xff1a;監聽范圍比較窄&#xff0c;只能通過屬性描…

Docker 直接運行一個 Alpine 鏡像

由于鏡像很小&#xff0c;下載時間往往很短&#xff0c;讀者可以直接使用 docker run 指令直接運行一個 Alpine 容器&#xff0c;并指定運行的 Linux 指令&#xff0c;例如&#xff1a; PS C:\Users\yhu> docker run alpine echo 123 Unable to find image alpine:latest lo…

Commit failed (details follow):is out of date

Commit failed (details follow):is out of date 關于SVN提交時報out-of-date錯誤的解決方法 提交項目文件時&#xff0c;報如下的信息&#xff1a; Item is out-of-date svn: Commit failed (details follow): svn: Item ‘/xxx/xxx/xxx/xxx/xxx/xxx’ is out of date 原因&…

手寫Spring5【筆記】

Spring5【筆記】 前言前言推薦Spring5【筆記】1介紹2手寫 最后 前言 這是陳舊已久的草稿2022-12-01 23:32:59 這個是刷B站的時候&#xff0c;看到一個手寫Spring的課程。 最后我自己好像運行不了&#xff0c;就沒寫。 現在2024-5-12 22:22:46&#xff0c;發布到[筆記]專欄中…

隊列(詳解)

一.隊列的概念 隊列&#xff08;Queue&#xff09;是一種常見的數據結構&#xff0c;它按照先進先出的原則管理數據。這意味著最先進入隊列的元素將被最先移出隊列&#xff0c;類似于現實生活中排隊的場景。 在隊列中&#xff0c;數據項被添加到隊列的一端&#xff0c;稱為隊尾…