婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 一篇文章揭秘Redis的磁盤持久化機制

一篇文章揭秘Redis的磁盤持久化機制

熱門標簽:四川穩定外呼系統軟件 地圖標注工廠入駐 南京手機外呼系統廠家 臺灣電銷 400電話辦理的口碑 一個地圖標注多少錢 廊坊外呼系統在哪買 b2b外呼系統 高碑店市地圖標注app

前言

Redis 是內存數據庫,數據都是存儲在內存中,為了避免進程退出導致數據的永久丟失,需要定期將 Redis 中的數據以數據或命令的形式從內存保存到本地磁盤。當下次 Redis 重啟時,利用持久化文件進行數據恢復。Redis 提供了 RDB 和 AOF 兩種持久化機制,前者將當前的數據保存到磁盤,后者則是將每次執行的寫命令保存到磁盤(類似于 MySQL 的 Binlog)。本文將詳細介紹 RDB 和 AOF 兩種持久化方案,包括操作方法和持久化的實現原理。

正文

Redis 是一個基于 K-V 存儲的數據庫服務器,下面先介紹 Redis 數據庫的內部構造以及 K-V 的存儲形式,有助于我們更容易理解 Redis 的持久化機制。

1. Redis數據庫結構

一個單機的 Redis 服務器默認情況下有 16 個數據庫(0-15號),默認使用的是 0 號數據庫,可以使用 SELECT 命令切換數據庫。


Redis 中的每個數據庫都由一個 redis.h/redisDb 結構表示,它記錄了單個 Redis 數據庫的鍵空間、所有鍵的過期時間、處于阻塞狀態和就緒狀態的鍵、數據庫編號等等。

typedef struct redisDb {
 // 數據庫鍵空間,保存著數據庫中的所有鍵值對
 dict *dict;
 // 鍵的過期時間,字典的鍵為鍵,字典的值為過期事件 UNIX 時間戳
 dict *expires;
 // 正處于阻塞狀態的鍵
 dict *blocking_keys;
 // 可以解除阻塞的鍵
 dict *ready_keys;
 // 正在被 WATCH 命令監視的鍵
 dict *watched_keys;
 struct evictionPoolEntry *eviction_pool;
 // 數據庫編號
 int id;
 // 數據庫的鍵的平均 TTL,統計信息
 long long avg_ttl;
} redisDb;

由于 Redis 是一個鍵值對數據庫(key-value pairs database), 所以它的數據庫本身也是一個字典,對應的結構正是 redisDb。其中,dict 指向的是一個記錄鍵值對數據的字典,它的鍵是一個字符串對象,它的值則可以是字符串、列表、哈希表、集合和有序集合在內的任意一種 Redis 類型對象。 expires 指向的是一個用于記錄鍵的過期時間的字典,它的鍵為 dict 中的數據庫鍵,它的值為這個數據庫鍵的過期時間戳,這個值以 long long 類型表示。


2. RDB持久化

RDB 持久化(也稱作快照持久化)是指將內存中的數據生成快照保存到磁盤里面,保存的文件后綴是 .rdb。rdb 文件是一個經過壓縮的二進制文件,當 Redis 重新啟動時,可以讀取 rdb 快照文件恢復數據。RDB 功能最核心的是 rdbSave 和 rdbLoad 兩個函數, 前者用于生成 RDB 文件并保存到磁盤,而后者則用于將 RDB 文件中的數據重新載入到內存中:


RDB 文件是一個單文件的全量數據,很適合數據的容災備份與恢復,通過 RDB 文件恢復數據庫耗時較短,通常 1G 的快照文件載入內存只需 20s 左右。Redis 提供了手動觸發保存、自動保存間隔兩種 RDB 文件的生成方式,下面先介紹 RDB 的創建和載入過程。

2.1. RDB的創建和載入

2.1.1. 手動觸發保存

Redis 提供了兩個用于生成 RDB 文件的命令,一個是 SAVE,另一個是 BGSAVE。而觸發 Redis 進行 RDB 備份的方式有兩種,一種是通過 SAVE 命令、BGSAVE 命令手動觸發快照生成的方式,另一種是配置保存時間和寫入次數,由 Redis 根據條件自動觸發保存操作。

1. SAVE命令

SAVE 是一個同步式的命令,它會阻塞 Redis 服務器進程,直到 RDB 文件創建完成為止。在服務器進程阻塞期間,服務器不能處理任何其他命令請求。

客戶端命令

127.0.0.1:6379> SAVE
OK

服務端日志

6266:M 15 Sep 2019 08:31:01.258 * DB saved on disk

執行 SAVE 命令后,Redis 在服務端進程(PID為6266)執行了 SAVE 操作,這個操作發生期間會一直阻塞 Redis 客戶端的請求處理。

2. BGSAVE命令

BGSAVE 是一個異步式的命令,和 SAVE 命令直接阻塞服務器進程的做法不同,BGSAVE 命令會派生出一個子進程,由子進程負責創建 RDB 文件,服務器進程(父進程)繼續處理客戶的命令。

客戶端命令

127.0.0.1:6379> BGSAVE
Background saving started

服務端日志

6266:M 15 Sep 2019 08:31:22.914 * Background saving started by pid 6283
6283:C 15 Sep 2019 08:31:22.915 * DB saved on disk
6266:M 15 Sep 2019 08:31:22.934 * Background saving terminated with success

通過服務端輸出的日志,可以發現Redis 在服務端進程(PID為6266)會為 BGSAVE 命令單獨創建(fork)一個子進程(PID為6283),并由子進程在后臺完成 RDB 的保存過程,在操作完成之后通知父進程然后退出。在整個過程中,服務器進程只會消耗少量時間在創建子進程和處理子進程信號量上面,其余時間都是待命狀態。

BGSAVE 是觸發 RDB 持久化的主流方式,下面給出 BGSAVE 命令生成快照的流程:


  1. 客戶端發起 BGSAVE 命令,Redis 主進程判斷當前是否存在正在執行備份的子進程,如果存在則直接返回
  2. 父進程 fork 一個子進程 (fork 的過程中會造成阻塞的情況),這個過程可以使用 info stats 命令查看 latest_fork_usec 選項,查看最近一次 fork 操作消耗的時間,單位是微秒
  3. 父進程 fork 完成之后,則會返回 Background saving started 的信息提示,此時 fork 阻塞解除
  4. fork 創建的子進程開始根據父進程的內存數據生成臨時的快照文件,然后替換原文件
  5. 子進程備份完畢后向父進程發送完成信息,父進程更新統計信息

3. SAVE和BGSAVE的比較

命令 SAVE BGSAVE
IO類型 同步 異步
是否阻塞 全程阻塞 fork時發生阻塞
復雜度 O(n) O(n)
優點 不會消耗額外的內存 不阻塞客戶端
缺點 阻塞客戶端 fork子進程消耗內存

2.1.2. 自動觸發保存

因為 BGSAVE 命令可以在不阻塞服務器進程的情況下執行,所以 Redis 的配置文件 redis.conf 提供了一個 save 選項,讓服務器每隔一段時間自動執行一次 BGSAVE 命令。用戶可以通過 save 選項設置多個保存條件,只要其中任意一個條件被滿足,服務器就會執行 BGSAVE 命令。 Redis 配置文件 redis.conf 默認配置了以下 3 個保存條件:

save 900 1
save 300 10 
save 60 10000

那么只要滿足以下 3 個條件中的任意一個,BGSAVE 命令就會被自動執行:

  • 服務器在 900 秒之內,對數據庫進行了至少 1 次修改。
  • 服務器在 300 秒之內,對數據庫進行了至少 10 次修改。
  • 服務器在 60 秒之內,對數據庫進行了至少 10000 次修改。

Redis 服務器會周期性地操作 serverCron 函數,這個函數每隔 100 毫秒就會執行一次,它的一項任務就是檢查 save 選項所設置的保存條件是否滿足,如果滿足的話,就自動執行 BGSAVE 命令。

2.1.3. 啟動自動載入

和使用 SAVE 和 BGSAVE 命令創建 RDB 文件不同,Redis 沒有專門提供用于載入 RDB 文件的命令,RDB 文件的載入過程是在 Redis 服務器啟動時自動完成的。啟動時只要在指定目錄檢測到 RDB 文件的存在,Redis 就會通過 rdbLoad 函數自動載入 RDB 文件。

下面是 Redis 服務器啟動時打印的日志,倒數第 2 條日志是在成功載入 RDB 文件后打印的。

$ redis-server /usr/local/etc/redis.conf
6266:C 15 Sep 2019 08:30:41.830 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=6266, just started
6266:C 15 Sep 2019 08:30:41.830 # Configuration loaded
6266:M 15 Sep 2019 08:30:41.831 * Increased maximum number of open files to 10032 (it was originally set to 256).
6266:M 15 Sep 2019 08:30:41.832 # Server initialized
6266:M 15 Sep 2019 08:30:41.833 * DB loaded from disk: 0.001 seconds
6266:M 15 Sep 2019 08:30:41.833 * Ready to accept connections

由于 AOF 文件屬于增量的寫入命令備份,RDB 文件屬于全量的數據備份,所以更新頻率比 RDB 文件的更新頻率高。所以如果 Redis 服務器開啟了 AOF 持久化功能,那么服務器會優先使用 AOF 文件來還原數據庫狀態;只有在 AOF 的持久化功能處于關閉狀態時,服務器才會使用優先使用 RDB 文件還原數據庫狀態。


2.2. RDB的文件結構

RDB 文件是經過壓縮的二進制文件,下面介紹關于RDB文件的一些細節。

2.2.1. 存儲路徑

SAVE 命令和 BGSAVE 命令都只會備份當前數據庫,備份文件名默認為 dump.rdb,可通過配置文件修改備份文件名 dbfilename xxx.rdb。可以通過以下命令查看備份文件目錄和 RDB 文件名稱:

$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/var/db/redis"
127.0.0.1:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"

RDB 文件的存儲路徑既可以在啟動前配置,也可以通過命令動態設定。

  • 配置項:通過 dir 配置指定目錄,dbfilename 指定文件名
  • 動態指定:Redis 啟動后也可以動態修改 RDB 存儲路徑,在磁盤損害或空間不足時非常有用,執行命令為:
config set dir {newdir}
config set dbfilename {newFileName}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • redis數據的兩種持久化方式對比
  • Redis做數據持久化的解決方案及底層原理
  • Redis教程(十):持久化詳解
  • Redis的持久化方案詳解
  • 淺談redis內存數據的持久化方式
  • Redis數據持久化方式技術解析

標簽:拉薩 定州 伊春 南寧 泰州 河源 畢節 甘南

巨人網絡通訊聲明:本文標題《一篇文章揭秘Redis的磁盤持久化機制》,本文關鍵詞  一篇,文章,揭秘,Redis,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一篇文章揭秘Redis的磁盤持久化機制》相關的同類信息!
  • 本頁收集關于一篇文章揭秘Redis的磁盤持久化機制的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产尤物一区二区在线| 国产一区二区精品久久99| 亚洲高清一区二区三区| 99热99精品| 亚洲欧洲日韩在线| 91色porny蝌蚪| 亚洲精品va在线观看| 日本韩国精品一区二区在线观看| 综合激情成人伊人| 色哟哟欧美精品| 亚洲综合激情另类小说区| 欧美亚洲日本一区| 日本欧美在线观看| 国产日产精品1区| 色呦呦一区二区三区| 日韩精品一二区| 久久久久久久久久久久久久久99 | 麻豆91在线播放免费| 欧美一级午夜免费电影| 国内国产精品久久| 国产精品久久毛片| 欧美三级在线看| 久久精品国产99国产| 国产精品乱人伦一区二区| 在线一区二区三区四区五区| 青草av.久久免费一区| 亚洲国产精品二十页| 欧美性猛交xxxxxxxx| 久久se这里有精品| 亚洲丝袜制服诱惑| 欧美一区二区三区影视| 成人一级片在线观看| 午夜私人影院久久久久| 欧美激情一二三区| 欧美老女人在线| www.视频一区| 国产电影一区二区三区| 亚洲超丰满肉感bbw| 欧美国产日韩一二三区| 6080亚洲精品一区二区| 北岛玲一区二区三区四区 | 综合欧美亚洲日本| 欧美成人精品二区三区99精品| 99久久久无码国产精品| 韩国一区二区三区| 亚洲成人精品一区| 国产精品不卡一区二区三区| 亚洲精品在线观| 在线播放中文一区| 91久久免费观看| 成人av免费网站| 国产精品99久久久久久宅男| 日本视频在线一区| 偷窥少妇高潮呻吟av久久免费| 欧美高清在线一区二区| 久久久五月婷婷| 欧美日本精品一区二区三区| 99综合电影在线视频| 国产精品一区二区视频| 久久机这里只有精品| 午夜视频在线观看一区二区三区| 亚洲资源中文字幕| 亚洲少妇屁股交4| 亚洲色图清纯唯美| 中文字幕免费观看一区| 久久精品无码一区二区三区| 91精品国产综合久久久久久| 欧美亚洲高清一区二区三区不卡| 91婷婷韩国欧美一区二区| 大白屁股一区二区视频| 丁香桃色午夜亚洲一区二区三区| 日韩主播视频在线| 欧美一区二区日韩| 韩国精品一区二区| 国产精品理伦片| 久久精品免视看| 国产日韩欧美电影| 国产精品午夜电影| 国产精品国产三级国产专播品爱网 | 亚洲天堂av一区| 一区二区三区四区激情| 亚洲精品高清视频在线观看| 亚洲精品日韩专区silk| 亚洲图片欧美综合| 婷婷综合另类小说色区| 美女视频免费一区| 国产在线不卡视频| 成人黄色小视频在线观看| 一本色道久久综合亚洲aⅴ蜜桃 | 久久久精品影视| 国产精品成人免费在线| 午夜精品福利一区二区蜜股av| 丝袜美腿亚洲综合| 国产麻豆一精品一av一免费| 波多野结衣中文一区| 欧美人牲a欧美精品| 2019国产精品| 亚洲一区二区3| 国产精一品亚洲二区在线视频| 99re亚洲国产精品| 欧美一级免费大片| 亚洲天堂精品视频| 久久不见久久见免费视频7| 一道本成人在线| 久久久久青草大香线综合精品| 国产精品福利一区二区| 欧美a一区二区| 在线亚洲一区二区| 国产日韩欧美综合一区| 日韩精品一二三区| 在线亚洲免费视频| 国产精品视频第一区| 捆绑调教一区二区三区| 欧美性猛交xxxxxxxx| 国产精品女同互慰在线看| 日日夜夜一区二区| 97久久精品人人做人人爽50路| 精品三级在线观看| 午夜成人免费电影| 欧美图片一区二区三区| 亚洲欧美一区二区三区久本道91| 精品无人码麻豆乱码1区2区 | 久久久国产一区二区三区四区小说| 亚洲精品福利视频网站| 国产一区激情在线| 日韩一区二区视频在线观看| 亚洲一区二区在线视频| 成人免费av网站| 久久精品视频在线看| 国产一区二区按摩在线观看| 日韩一区二区在线免费观看| 日本欧美一区二区在线观看| 在线电影一区二区三区| 亚欧色一区w666天堂| 欧美午夜精品久久久久久孕妇| 亚洲最大成人综合| 91美女福利视频| 尤物视频一区二区| 色婷婷综合久色| 亚洲国产毛片aaaaa无费看| 91成人在线精品| 偷拍亚洲欧洲综合| 91精品国产aⅴ一区二区| 午夜电影一区二区三区| 欧美日韩一区三区四区| 亚洲444eee在线观看| 欧美一区在线视频| 激情图区综合网| 国产欧美日韩视频一区二区| 国产成人欧美日韩在线电影| 国产女人aaa级久久久级| 成人av片在线观看| 亚洲香蕉伊在人在线观| 欧美老女人第四色| 久久99九九99精品| 国产农村妇女毛片精品久久麻豆| 99久久99久久综合| 亚洲成精国产精品女| 欧美va亚洲va| 成人激情小说乱人伦| 亚洲激情在线激情| 欧美一级专区免费大片| 成人av一区二区三区| 亚洲高清在线视频| 久久九九久精品国产免费直播| 99视频热这里只有精品免费| 香蕉av福利精品导航 | 91精品国产乱| 国产sm精品调教视频网站| 亚洲欧美经典视频| 51精品久久久久久久蜜臀| 国产成人精品免费在线| 亚洲综合丝袜美腿| wwwwww.欧美系列| 欧美日韩久久一区二区| 高清成人免费视频| 日韩经典中文字幕一区| 亚洲国产精品激情在线观看| 欧美日韩极品在线观看一区| 懂色一区二区三区免费观看| 亚洲国产一区在线观看| 国产调教视频一区| 91.xcao| 97aⅴ精品视频一二三区| 国产一区二区伦理片| 亚洲国产成人av| ...xxx性欧美| 久久青草国产手机看片福利盒子| 欧美性受xxxx| 91丝袜美腿高跟国产极品老师 | 亚洲福利国产精品| 国产三级精品在线| 91精品国产一区二区三区 | 成人免费视频国产在线观看| 日韩成人伦理电影在线观看| 1000精品久久久久久久久| 欧美精品一区在线观看| 欧美一区永久视频免费观看| 在线视频一区二区三区| 色域天天综合网|