【redis】什么是持久化之 RDB

什么是持久化

MySQL 的事務,有四個比較核心的特性:

  1. 原子性
  2. 一致性
  3. 持久性==>持久化(說的一回事)
  • 把數據存儲在硬盤上==>持久
  • 把數據存在內存上==>不持久
  • 重啟進程/重啟主機之后,數據是否還存在
  1. 隔離性

Redis 是一個內存數據庫,是把數據存在內存中的。內存中的數據并不是持久的,要想能做到持久,就需要讓 Redis 把數據存儲在硬盤上

Redis 相比于 MySQL 這樣的關系型數據庫,最明顯的有點/優勢==>效率高/快

  • 因為它的數據是存在內存上的

如何實現持久化

為了保證速度快,數據肯定還得再內存中,但是為了持久,數據還得想辦法存儲在硬盤上

  • redis 決定,內存和硬盤上都存數據
  • 這樣的兩份數據,理論上是完全相同的(實際上可能存在一個小的概率有差異,取決于我們具體怎么進行持久化)

  • 當要插入一個新的數據的時候,就需要把這個數據,同時寫入內存和硬盤。
    • 實際上怎么寫入硬盤,還有不同的策略,不會導致每次都要寫兩份,導致效率降低
  • 當查詢某個數據的時候,直接從內存讀取
  • 硬盤的數據只是在 redis 重啟的時候,用來恢復內存中的數據的
    這樣就既能保證高效,又能通過硬盤恢復數據,保證持久化的效果,代價就是消耗了更多空間(一份數據,存了兩遍)(硬盤便宜,不會帶來太多成本)

實現策略

  1. RDB --> Redis DataBase
  2. AOF --> Append Only FIle

RDB

定期的把我們 Redis 內存中的數據,都給寫入硬盤中,生成一個“快照

  • Redis 給內存中當前存儲的這些數據,趕緊拍個照片,生成一個文件,存儲在硬盤中
  • 后續 Redis 一旦重啟了(內存數據就沒了),就可以根據剛才的“快照”,把內存中的數據給恢復回來

[!quote] 快照
某個案發現場,警察來了之后,會拉上警戒線,然后開始忙碌地拍照,記錄現場==>后續就可以根據這些記錄的照片,來還原出現場當前發生了什么

定期”具體又分為兩種方式:

  1. 手動觸發
    • 程序員通過 Redis 客戶端,執行特定的命令,來觸發快照生成(savebgsave
  2. 自動觸發
    • Redis 配置文件中,設置一下,讓 Redis 每隔多長時間/每產生多少次修改就出發

手動觸發

執行 save 的時候,Redis 就會全力以赴的進行“快照生成”操作,此時就會阻塞 Redis 的其他客戶端的命令

  • 類似于 keys * 的后果
  • 一般不建議使用

save 是在前臺,bgsavebackground)是在后面偷摸進行,不會影響 Redis 服務器處理其他客戶端的請求和命令

  • 這樣既可以保證持久化
  • 又可以保證 Redis 可以正常去響應命令

bgsave

Redis 是怎么做到 bgsave 的呢?是不是偷偷搞了個多線程?

  • 并非如此,多線程是實現并發編程的場景的一種方式,但不是唯一
  • Redis 使用的是“多進程”的方式,來完成的并發編程,實現 bgsave

image.png

Redis 服務器(父進程)收到 bgsave 的命令之后,首先會進行一個判斷

1 . 判定當前是否已經存在其他正在工作的子進程

比如現在已經有一個子進程正在執行 bgsave,此時就直接把當前的 bgsave 返回


2 . 如果沒有其他的工作子進程,就通過 fork 這樣的系統調用,創建一個子進程來

forkLinux 系統提供的一個創建子進程的 API

  • 如果是其他系統,比如 Windows,創建子進程就不是 forkCreatProcess
  • fork 創建子進程,簡單粗暴,就是直接把當前的進程(父進程)復制一份,作為子進程。一旦復制完成了,父子進程就是兩個獨立的進程,就格子執行各自的了
    • 會復制 PCB、虛擬地址空間(內存中的數據)、文件描述附表…
    • 本來 redis server 中,有若干變量,保存了一些鍵值對數據。隨著這樣的 fork 的進行,子進程的這個內存里也會存在和剛才父進程中一模一樣的變量

因此,復制出來的“克隆體“(子進程),內存中的數據就是和“本體”(父進程)是一樣的。接下來安排子進程去進行“持久化”操作,也就相當于把父進程本體這里的數據給持久化了

父進程打開了一個文件,fork 了之后,子進程也是可以同時使用這個文件的

  • 導致了子進程持久化寫入的那個文件,和父進程本來要寫的文件是同一個

如果當前 redis 服務器中存儲的數據特別多,內存消耗特別大,此時進行上述的復制操作,是否會有很大的性能開銷?

  • 此處的性能開銷其實挺小
  • fork 在進行內存拷貝的時候,不是簡單無腦的直接把所有的數據都拷貝一遍,而是“寫實拷貝”的機制來完成的
    • 如果子進程里的這個內存數據,和父進程的內存數據完全一樣,此時就不會觸發真正的拷貝動作(而是爺倆其實用一份內存數據)
    • 但是,其實這倆進程的內存空間,應該是各自獨立的。一旦某一方針對這個數據進行了修改,就會立即觸發真正的物理內存上的數據拷貝

在進行 bgsave 這個場景中,絕大部分的內存數據,是不需要進行改變的(整體來說這個過程執行的還挺快,這個短時間內,父進程中不會有大批的內存數據變化)

因此,子進程的“寫實拷貝”不會觸發很多次,也就保證了整體的“拷貝時間”是可控的,高效的


  1. 子進程負責進行寫文件,生成快照的過程,父進程繼續接收客戶端的請求,繼續正常提供服務

  1. 子進程完成整體的持久化過程之后,就會通知父進程干完了,父進程就會更新一些統計信息,子進程就可以結束銷毀了

總結:
創建子進程,子進程完成持久化操作,持久化會把數據寫入到新的文件中,然后使用新的文件替換舊的文件

  • 子進程不好觀察,我們觀察新舊文件(通過 stat 命令,查看文件的 inode 號)

RDB 文件

redis 生成的 RDB 文件,是放在 redis 的工作目錄中的,也是在 redis 配置文件中進行設置的

image.png

  • RDB 機制生成的鏡像文件,redis 服務器默認就是開啟了 RDB
  • 這是一個二進制文件,把內存中的數據,以壓縮(消耗一定 CPU 資源,但是能省空間)的形式,保存到這個二進制文件中
    • 最多打開看看就行了,不要亂改,一旦要是把數據的格式改壞了,就麻煩了
    • 后續 redis 服務器重新啟動,就會嘗試加載這個 RDB 文件,如果發現格式錯誤,就可能會加載數據失敗

redis 提供了 RDB 文件的檢查工具image.png|256

當執行生成 RDB 鏡像操作的時候,此時就會把要生產的快照數據,先保存到一個臨時文件中。當這個快照生成完畢之后,再刪除之前的 RDB 文件,把新生成的臨時的 RDB 文件名字改成剛才的 dump.rdb

  • 自始至終,RDB 文件始終只有一個

效果

RDB 文件中的數據,不是你這邊插入了數據,就會立即更新的

  • image.png|438
  • 插入數據之后,觀察 RDB 文件內容 image.png image.png|427
  • 發現沒有變化,此時我們執行保存數據的命令image.png
    image.png|331

可以發現 RDB 文件內容更新了


RDB 的觸發時機:

  1. 手動(save、bgsave)
  2. 自動(配置文件中,進行設置)

image.png

  • 900s 之后,并且至少存在一次 key 的修改,就會觸發自動更新

這些數值都是可以自由修改的,但是此處修改數據的時候,有一個基本的原則:

  • 生成一次 RDB 快照,這個成本較高,不能讓這個操作執行太頻繁

redis 持久化生成快照操作,不僅僅是手動執行命令才出發,也可以自動觸發

  1. 通過剛才配置文件中 save 執行 M 時間內,修改 N
  2. 通過 shutdown 命令(redis 里的一個命令)關閉 redis 服務器,也會觸發(service redis-server restart)(正常關閉
  3. redis 進行主從復制的時候,主節點也會自動生成 RDB 快照,然后把 RDB 快照文件內容傳輸給從節點
  • 如果是通過正常流程重新啟動 redis 服務器,此時 redis 服務器會在退出的時候,自動觸發生成 RDB 操作
  • 但如果是異常重啟(kill -9 或者服務器掉電),此時 redis 服務器來不及生成 RDB,內存中尚未保存到快照中的數據,就會隨著重啟而丟失
  • 若要修改 RDB 配置,修改完成后需要重啟服務器
  • 如果 RDB 文件被改壞了,redis 服務器啟動不了了,我們可以去看一下日志,查看報錯信息

redis 提供了 RDB 文件的檢查工具,可以先通過檢查工具,檢查一下 RDB 文件格式是否符合要求 image.png|301

  • 檢查工具和 reids 服務器,在 5.0 版本是同一個可執行程序,但是我們可以在運行的時候加上不同選項
  • 在運行的時候,加上 RDB 文件作為命令行參數,此時就是以檢查工具的方式來運行

image.png

  • 這里就顯示 RDB 文件里面有錯誤

RDB 小結

  • RDB 是一個緊湊壓縮的二進制文件,代表 redis 在某個時間點上的數據快照。非常適用于備份,全量復制等場景。比如每 6 小時執行 bgsave 備份,并把 RDB 文件復制到遠程機器或者文件系統中(如 hdfs)用于災備
  • redis 加載 RDB 恢復數據遠遠快于 AOF 的方式
    • RDB 是使用二進制的方式來組織數據,直接把數據讀取到內存中,按照字節的格式取出來,放到結構體/對象中即可
    • AOF 是使用文本的方式來組織數據
  • RDB 方式數據沒辦法做到實時持久化,因為 bgsave 每次運行都要執行 fork 創建子進程,屬于重量級操作,頻繁執行成本過高
  • RDB 文件使用特定二進制格式保存,redis 版本演進過程中有多個 RDB 版本,兼容性可能有風險
    • 老版本的 redisRDB 文件,放到新版本的 redis 中不一定能識別

如果確實需要有一些“升級版本”的需求,就可以通過寫一個程序的方式,直接遍歷舊的 redis 中的所有 key,把數據取出來,插入到新的 redis 服務器中即可

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

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

相關文章

Python 鼠標軌跡算法 - 防止游戲檢測

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序,它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言,原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢: 模擬…

游戲立項時期隨筆記錄(1)

模擬經營的項目還沒有完全結束,這幾天又有可能涉及到一個新項目。感想隨筆記錄一下,防止忘記。今天一天整理這個,搞得今天沒時間看數學和AI。 在 Unity3D 游戲前端主程序的立項時期,核心目標是明確技術方向、評估可行性、搭建基礎…

Channel-wise Knowledge Distillation for Dense Prediction論文閱讀和

paper:https://arxiv.org/pdf/2011.13256.pdf code:https://github.com/open-mmlab/mmrazor 這篇paper主要是商湯開源的mmrazor中提及在detection有效果,我之前記錄的幾篇sota文章雖然在各自的paper中在detection領域都有提及有增益&#…

hide函數的使用方法

在編程中,我們常常需要控制元素的顯示與隱藏。特別是在前端開發中,hide 函數是一個非常常見的操作,尤其是在 JavaScript 和 jQuery 中。它可以讓你輕松地將元素從視圖中隱藏,進而提升用戶交互體驗和頁面的響應能力。本文將介紹如何…

【MySQL】基本操作 —— DML 與約束

目錄 DML 基本介紹DML 常見操作添加數據 insert給指定字段添加數據給全部字段添加數據給指定字段批量添加數據給全部字段批量添加數據 修改數據 update刪除數據 delete 約束基本概念約束操作主鍵約束添加單列主鍵添加多列主鍵(聯合主鍵)修改表結構添加主…

nginx配置轉發到另一個網站或另一臺服務器的服務

需求背景 在一臺服務器上安裝了一個服務,不想使用ip:port方式,想使用域名打開這個服務的地址。 1. 配置轉發 1.1 參數解釋 listen:指定 Nginx 監聽的端口。在上面的例子中,Nginx 監聽 8888 端口。server_name:用于…

HarmonyOS三層架構實戰

目錄: 1、三層架構項目結構1.0、三層架構簡介1.1、 common層(主要放一些公共的資源等)1.2、 features層(主要模塊定義的組件以及圖片等靜態資源)1.3、 products層(主要放主頁面層和一些主要的資源&#xff…

macOS homebrew - 切換源

https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ 環境變量中 添加: export HOMEBREW_BREW_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn…

ETL中的實用功能以及數據集成方式

在企業數字化轉型的進程中,數據集成扮演著至關重要的角色。它不僅是實現信息流動和系統協同的關鍵步驟,更是提升企業運營效率和決策能力的核心驅動力。ETL(Extract,Transform,Load)作為數據集成的重要工具&…

基于Springboot+Typst的PDF生成方案,適用于報告打印/標簽打印/二維碼打印等

基于SpringbootTypst的PDF生成方案,適用于報告打印/標簽打印/二維碼打印等。 僅提供后端實現 Typst2pdf-for-report/label/QR code github 環境 JDK11linux/windows/mac 應用場景 適用于定制化的報告模板/標簽/條碼/二維碼等信息的pdf生成方案。通過瀏覽器的p…

OSG簡介

OSG OpenSceneGraph (簡稱 OSG) 是一個開源的高性能3D圖形庫。 作用 它為開發者提供了一個強大的API,處理和渲染復雜的3D圖形。 特點 OSG基于OpenGL構建,提供了對現代圖形技術的支持,如著色器、紋理映射、光照模型等高級特性。 跨平臺支…

簡述下npm,cnpm,yarn和pnpm的區別,以及跟在后面的-g,--save, --save-dev代表著什么

文章目錄 前言一、npm,cnpm,yarn和pnpm的基本介紹和特點1.npm (Node Package Manager)2. Yarn3. cnpm (China npm)4. pnpm 二、簡述npm和pnpm 的存儲方式和依賴數1.存儲方式2.依賴樹 三、兩者依賴樹的差異導致結果的對比四、簡單說說-g,--sav…

三分鐘掌握視頻剪輯 | 在 Rust 中優雅地集成 FFmpeg

前言 在當今的短視頻時代,高效的視頻剪輯已成為內容創作者和開發者的迫切需求。無論是裁剪視頻開頭結尾、提取高光時刻,還是制作 GIF、去除廣告,剪輯都是必不可少的一環。 然而,批量處理大量視頻并非易事,常見的挑戰…

Python 視頻爬取教程

文章目錄 前言基本原理環境準備Python安裝選擇Python開發環境安裝必要庫 示例 1:爬取簡單直鏈視頻示例 2:爬取基于 HTML5 的視頻(以某簡單視頻網站為例) 前言 以下是一個較為完整的 Python 視頻爬取教程,包含基本原理…

ollama搭建deepseek調用詳細步驟

在使用 Ollama 搭建 DeepSeek 并投喂數據的過程中,你需要幾個主要步驟來確保一切順利進行。以下是詳細的指南,涵蓋了從準備工作到實際投喂數據的所有環節。 準備環境確保你的計算機具備足夠的硬件資源: CPU: 至少8核處理器(推薦12核以上)內存: 至少32GB RAM(推薦64GB以上…

VSCode C/C++ 開發環境完整配置及常見問題(自用)

這里主要記錄了一些與配置相關的內容。由于網上教程眾多,部分解決方法并不能完全契合我遇到的問題,因此我選擇以自己偏好的方式,對 VSCode 進行完整的配置,并記錄在使用過程中遇到的問題及解決方案。后續內容也會持續更新和完善。…

如何搭建一個安全經濟適用的TRS交易平臺?

TRS(總收益互換)一種多方參與的投資方式,也是絕對收益互換(total return swap)的一種形式。 它是一種衍生合約,是一種金融衍生品的合約,是指交易雙方在協議期間將參照資產的總收益轉移給信用保…

SpringMVC(四)Restful軟件架構風格

目錄 ?編輯 API接口設計的架構風格 一 Dao層實現(處理數據庫) 二 Sercice層實現(處理業務邏輯) 三 Controller層(處理http請求) 四 補充知識點 1 PathVariable - 路徑變量 2 CrossOrigin(Origins …

Docker搭建MySQL主從服務器

一、在主機上創建MySQL配置文件——my.cnf master服務器配置文件路徑:/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服務器配置文件路徑: /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服務配置文件內容 …

鴻蒙路由 HMrouter 配置及使用一

1、學習鏈接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下載安裝 ohpm install hadss/hmrouter 添加編譯插件配置 在工程目錄下的build-profile.json5中,配置useNormalizedOHMUrl屬性為true (我這項目創…