亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

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

2020-10-28 21:29:07
字體:
來源:轉載
供稿:網友

前言

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> SAVEOK

服務端日志

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> BGSAVEBackground saving started

服務端日志

6266:M 15 Sep 2019 08:31:22.914 * Background saving started by pid 62836283:C 15 Sep 2019 08:31:22.915 * DB saved on disk6266: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 1save 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.conf6266:C 15 Sep 2019 08:30:41.830 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=6266, just started6266:C 15 Sep 2019 08:30:41.830 # Configuration loaded6266: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 initialized6266:M 15 Sep 2019 08:30:41.833 * DB loaded from disk: 0.001 seconds6266: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 6379127.0.0.1:6379> CONFIG GET dir1) "dir"2) "/usr/local/var/db/redis"127.0.0.1:6379> CONFIG GET dbfilename1) "dbfilename"2) "dump.rdb"

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美福利视频在线| 日韩精品福利在线| 亚洲无线码在线一区观看| 亚洲男人天堂视频| 亚洲综合大片69999| 国产精品黄页免费高清在线观看| 久久电影一区二区| 国产成+人+综合+亚洲欧美丁香花| 精品福利视频导航| 久久久午夜视频| 77777少妇光屁股久久一区| 亚洲美女免费精品视频在线观看| 日本人成精品视频在线| 国产免费亚洲高清| 欧美乱大交做爰xxxⅹ性3| 国产网站欧美日韩免费精品在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲激情在线视频| 日韩在线播放视频| 欧美视频裸体精品| 欧美香蕉大胸在线视频观看| 日韩精品在线免费观看| 97福利一区二区| 欧美成人h版在线观看| 中文字幕国产日韩| 成年无码av片在线| 亚洲福利视频专区| 亚洲精品女av网站| 亚洲欧美国产精品| 成人激情视频在线观看| 日韩精品在线第一页| 91色视频在线观看| 91香蕉国产在线观看| 黄网动漫久久久| 国产又爽又黄的激情精品视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产一区二区黑人欧美xxxx| 黄色成人在线免费| 亚洲xxxx18| 国产狼人综合免费视频| 欧美极品少妇xxxxⅹ喷水| 国产精品尤物福利片在线观看| 亚洲欧洲第一视频| 久久成人精品一区二区三区| 91在线高清免费观看| 日韩精品在线免费| 日韩av在线天堂网| 亚洲欧洲xxxx| 亚洲一区中文字幕| 日韩电影网在线| 少妇久久久久久| 亚洲美女福利视频网站| 欧美午夜片在线免费观看| 中文字幕少妇一区二区三区| 国产精品91在线观看| 亚洲精品一区在线观看香蕉| 亚洲一区二区三区香蕉| 久久久久久午夜| 亚洲va国产va天堂va久久| 久久精品亚洲热| 中文字幕一区电影| 国产精品国产三级国产aⅴ浪潮| 亚洲成人精品av| 欧美视频免费在线观看| 亚洲三级黄色在线观看| 欧美精品video| 日本亚洲精品在线观看| 亚洲欧美三级在线| 国产精品成人在线| 欧美日韩999| 国产精品久久久久久久久久久久久久| 久久久免费观看视频| 国产亚洲一区精品| 亚洲国产第一页| 日韩中文字幕网站| 国产91免费看片| 欧洲亚洲在线视频| 国产成人午夜视频网址| 亚洲一区二区国产| 日韩最新中文字幕电影免费看| 欧美一级大片在线观看| 久久精品国产99国产精品澳门| 国产精品福利在线观看| 日韩精品在线观看一区| 性色av一区二区三区红粉影视| 欧美激情亚洲另类| 日本高清久久天堂| 亚洲自拍偷拍在线| 欧美精品精品精品精品免费| 午夜精品久久17c| 国产精品一区二区三区在线播放| 成人黄色中文字幕| 久久亚洲国产成人| 久久99久久99精品中文字幕| 欧美日韩在线一区| 中文字幕日韩av电影| 91黄色8090| 亚洲国产精品yw在线观看| 欧美午夜精品伦理| 亚洲女人天堂色在线7777| 欧美极度另类性三渗透| 成人欧美一区二区三区黑人| 91国产高清在线| 91tv亚洲精品香蕉国产一区7ujn| 欧美亚洲一区在线| 日本伊人精品一区二区三区介绍| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩av电影手机在线观看| 国产精品一区二区久久国产| 国产精品久久久久久久app| 亚洲欧美日本精品| 久久久综合免费视频| 久久激情视频免费观看| 亚洲自拍在线观看| 久久久精品久久久久| 热re99久久精品国产66热| 欧美小视频在线| 成人免费淫片视频软件| 国产一区二区日韩精品欧美精品| 欧美性高跟鞋xxxxhd| 国产精品jvid在线观看蜜臀| 萌白酱国产一区二区| 久久久精品视频成人| 久久久噜噜噜久久中文字免| 韩国欧美亚洲国产| 欧美日韩激情视频8区| 视频在线一区二区| 久久久之久亚州精品露出| 91久久精品国产| 奇米4444一区二区三区| 色哟哟入口国产精品| 精品国产一区二区三区在线观看| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩国产在线看| 亚洲午夜久久久久久久| 国产精品成人免费电影| 日韩免费在线播放| 久热精品视频在线免费观看| 成人www视频在线观看| 亚洲精品电影久久久| 正在播放欧美视频| 久久精品成人欧美大片古装| 亚洲精品色婷婷福利天堂| 亚洲免费中文字幕| 欧美激情区在线播放| 国产精品成人国产乱一区| 色爱精品视频一区| 久久五月天综合| 91精品国产综合久久香蕉最新版| 永久免费看mv网站入口亚洲| 色香阁99久久精品久久久| 久久视频这里只有精品| 国产九九精品视频| 国产一区二区丝袜| 欧洲亚洲免费在线| 欧美成人三级视频网站| 91精品免费视频| 久久不射电影网| 国产一区二区成人| 成人免费在线视频网站| 91精品视频观看| 亚洲а∨天堂久久精品9966| 亚洲一区国产精品| 欧美性69xxxx肥|