Redis詳解(一)——RDB

来源:https://www.cnblogs.com/lee0527/archive/2020/02/01/12248756.html
-Advertisement-
Play Games

Redis詳解(一)——RDB 前言 由於 Redis 是一個記憶體資料庫,所謂記憶體資料庫,就是將資料庫中的內容保存在記憶體中,這與傳統的MySQL,Oracle等關係型資料庫直接將內容保存到硬碟中相比,記憶體資料庫的讀寫效率比傳統資料庫要快的多(記憶體的讀寫效率遠遠大於硬碟的讀寫效率)。但是保存在記憶體中也 ...


Redis詳解(一)——RDB

前言

由於 Redis 是一個記憶體資料庫,所謂記憶體資料庫,就是將資料庫中的內容保存在記憶體中,這與傳統的MySQL,Oracle等關係型資料庫直接將內容保存到硬碟中相比,記憶體資料庫的讀寫效率比傳統資料庫要快的多(記憶體的讀寫效率遠遠大於硬碟的讀寫效率)。但是保存在記憶體中也隨之帶來了一個缺點,一旦斷電或者宕機,那麼記憶體資料庫中的數據將會全部丟失。

  為瞭解決這個缺點,Redis提供了將記憶體數據持久化到硬碟,以及用持久化文件來恢複數據庫數據的功能。Redis 支持兩種形式的持久化,一種是RDB快照(snapshotting),另外一種是AOF(append-only-file)。本篇博客先對 RDB 快照進行介紹。

1、RDB 簡介

  RDB是Redis用來進行持久化的一種方式,是把當前記憶體中的數據集快照寫入磁碟,也就是 Snapshot 快照(資料庫中所有鍵值對數據)。恢復時是將快照文件直接讀到記憶體里。

2、觸發方式

  RDB 有兩種觸發方式,分別是自動觸發和手動觸發。

①、自動觸發

  在 redis.conf 配置文件中

img

  ①、save:這裡是用來配置觸發 Redis的 RDB 持久化條件,也就是什麼時候將記憶體中的數據保存到硬碟。比如“save m n”。表示m秒內數據集存在n次修改時,自動觸發bgsave(這個命令下麵會介紹,手動觸發RDB持久化的命令)

  預設如下配置:

save 900 1:表示900 秒內如果至少有 1 個 key 的值變化,則保存
save 300 10:表示300 秒內如果至少有 10 個 key 的值變化,則保存
save 60 10000:表示60 秒內如果至少有 10000 個 key 的值變化,則保存

  當然如果你只是用Redis的緩存功能,不需要持久化,那麼你可以註釋掉所有的 save 行來停用保存功能。可以直接一個空字元串來實現停用:save ""

  ②、stop-writes-on-bgsave-error :預設值為yes。當啟用了RDB且最後一次後臺保存數據失敗,Redis是否停止接收數據。這會讓用戶意識到數據沒有正確持久化到磁碟上,否則沒有人會註意到災難(disaster)發生了。如果Redis重啟了,那麼又可以重新開始接收數據了

  ③、rdbcompression ;預設值是yes。對於存儲到磁碟中的快照,可以設置是否進行壓縮存儲。如果是的話,redis會採用LZF演算法進行壓縮。如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能,但是存儲在磁碟上的快照會比較大。

  ④、rdbchecksum :預設值是yes。在存儲快照後,我們還可以讓redis使用CRC64演算法來進行數據校驗,但是這樣做會增加大約10%的性能消耗,如果希望獲取到最大的性能提升,可以關閉此功能。

  ⑤、dbfilename :設置快照的文件名,預設是 dump.rdb

  ⑥、dir:設置快照文件的存放路徑,這個配置項一定是個目錄,而不能是文件名。預設是和當前配置文件保存在同一目錄。

  也就是說通過在配置文件中配置的 save 方式,當實際操作滿足該配置形式時就會進行 RDB 持久化,將當前的記憶體快照保存在 dir 配置的目錄中,文件名由配置的 dbfilename 決定。

②、手動觸發

  手動觸發Redis進行RDB持久化的命令有兩種:

  1、save

  該命令會阻塞當前Redis伺服器,執行save命令期間,Redis不能處理其他命令,直到RDB過程完成為止。

  顯然該命令對於記憶體比較大的實例會造成長時間阻塞,這是致命的缺陷,為瞭解決此問題,Redis提供了第二種方式。

  2、bgsave

  執行該命令時,Redis會在後臺非同步進行快照操作,快照同時還可以響應客戶端請求。具體操作是Redis進程執行fork操作創建子進程,RDB持久化過程由子進程負責,完成後自動結束。阻塞只發生在fork階段,一般時間很短。

  基本上 Redis 內部所有的RDB操作都是採用 bgsave 命令。

  ps:執行執行 flushall 命令,也會產生dump.rdb文件,但裡面是空的,無意義

3、恢複數據

  將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啟動服務即可,redis就會自動載入文件數據至記憶體了。Redis 伺服器在載入 RDB 文件期間,會一直處於阻塞狀態,直到載入工作完成為止。

  獲取 redis 的安裝目錄可以使用 config get dir 命令

  img

4、停止 RDB 持久化

  有些情況下,我們只想利用Redis的緩存功能,並不像使用 Redis 的持久化功能,那麼這時候我們最好停掉 RDB 持久化。可以通過上面講的在配置文件 redis.conf 中,可以註釋掉所有的 save 行來停用保存功能或者直接一個空字元串來實現停用:save ""

  也可以通過命令:

redis-cli config set save " "

5、RDB 的優勢和劣勢

  ①、優勢

  1.RDB是一個非常緊湊(compact)的文件,它保存了redis 在某個時間點上的數據集。這種文件非常適合用於進行備份和災難恢復。

  2.生成RDB文件的時候,redis主進程會fork()一個子進程來處理所有保存工作,主進程不需要進行任何磁碟IO操作。

  3.RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。

  ②、劣勢

  1、RDB方式數據沒辦法做到實時持久化/秒級持久化。因為bgsave每次運行都要執行fork操作創建子進程,屬於重量級操作(記憶體中的數據被克隆了一份,大致2倍的膨脹性需要考慮),頻繁執行成本過高(影響性能)

  2、RDB文件使用特定二進位格式保存,Redis版本演進過程中有多個格式的RDB版本,存在老版本Redis服務無法相容新版RDB格式的問題(版本不相容)

  3、在一定間隔時間做一次備份,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改(數據有丟失)

6、RDB 自動保存的原理

  Redis有個伺服器狀態結構:

struct redisService{
     //1、記錄保存save條件的數組
     struct saveparam *saveparams;
     //2、修改計數器
     long long dirty;
     //3、上一次執行保存的時間
     time_t lastsave;
}

  ①、首先看記錄保存save條件的數組 saveparam,裡面每個元素都是一個 saveparams 結構:

struct saveparam{
     //秒數
     time_t seconds;
     //修改數
     int changes;
};

  前面我們在 redis.conf 配置文件中進行了關於save 的配置:

save 900 1:表示900 秒內如果至少有 1 個 key 的值變化,則保存
save 300 10:表示300 秒內如果至少有 10 個 key 的值變化,則保存
save 60 10000:表示60 秒內如果至少有 10000 個 key 的值變化,則保存

  那麼伺服器狀態中的saveparam 數組將會是如下的樣子:

  img

  ②、dirty 計數器和lastsave 屬性

  dirty 計數器記錄距離上一次成功執行 save 命令或者 bgsave 命令之後,Redis伺服器進行了多少次修改(包括寫入、刪除、更新等操作)。

  lastsave 屬性是一個時間戳,記錄上一次成功執行 save 命令或者 bgsave 命令的時間。

  通過這兩個命令,當伺服器成功執行一次修改操作,那麼dirty 計數器就會加 1,而lastsave 屬性記錄上一次執行save或bgsave的時間,Redis 伺服器還有一個周期性操作函數 severCron ,預設每隔 100 毫秒就會執行一次,該函數會遍歷並檢查 saveparams 數組中的所有保存條件,只要有一個條件被滿足,那麼就會執行 bgsave 命令。

  執行完成之後,dirty 計數器更新為 0 ,lastsave 也更新為執行命令的完成時間。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 最近因為公司需要,需要瞭解下java探針,在網上找資料,發現資料還是有很多的,但是例子太少,有的直接把公司代碼粘貼出來,太複雜了,有的又特別簡單不是我想要的例子, 我想要這樣的一個例子: jvm在運行,我想動態修改一個類,jvm在不用重啟的情況下, 自動載入新的類定義. 動態修改類定義,聽著感 ...
  • web應用常見的資源存方式 在WEB-INF下新建lib,存放要使用的jar包 在WEB-INF下新建jsp文件夾,存放jsp文件。首頁除外,首頁就放到web下。 在web下,或WEB-INF下,新建css、js、image文件夾,存放相關文件。 WEB-INF目錄是web應用的安全目錄,裡面的資源 ...
  • Spring官方支持的服務的渲染模板中,並不包含jsp。而是Thymeleaf和Freemarker等,而Thymeleaf與SpringMVC的視圖技術,及SpringBoot的自動化配置集成非常完美,幾乎沒有任何成本,你只用關註Thymeleaf的語法即可。 Thymeleaf的特點 動靜結合: ...
  • 繼承關係用不好女人也可以是男人,複合關係用不好「狗中有人,人中有狗」的事情也會有。 ...
  • 第一種註冊方法 from flask import Flask app = Flask(__name__) @app.route("/hello") # 第一種註冊方法 def hello(): return "hello python!!!" if __name__ == "__main__": ...
  • 我們在進行APP開發的時候都會遇到一個文件:AndroidManifest.xml。從剛開始進行Android開發,到現在已經過去了幾個月,還是對這個文件一知半解,只知道它是配置用的。但是這文件里的東西具體有什麼用,該怎麼用一直都沒有理解。藉著做項目的機會,仔細研究一下這個文件。 研究Android ...
  • 這次我們可以看看併發中鎖的原理,大概會說到AQS,ReentrantLock,ReentrantReadWriteLock以及JDK8中新增的StampedLock,這些都是在java併發中很重要的東西,慢慢看吧! 一.LockSupport工具類 LockSupport工具類是jdk中rt.jar ...
  • 一、現象描述 筆者在用visual studio2010進行控制台程式進行程式編譯時候,經常會遇到代碼代碼沒有語法錯誤,但是編譯不通過的現象。系統報錯為 這個錯誤總是出現,特別是在每次新裝系統後,很是煩人。 二、出現原因 通過查閱相關資料可知: 出現該問題的原因通常是由於高版本與低版本之間的鏈接文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...