欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Redis中的RDB快照

 更新時間:2021年06月29日 10:09:03   作者:小林coding  
雖說Redis是內(nèi)存數(shù)據(jù)庫,但是它為數(shù)據(jù)的持久化提供了兩個技術,分別是AOF日志和RDB快照。這兩種技術都會用各用一個日志文件來記錄信息,但是記錄的內(nèi)容是不同的。AOF 文件的內(nèi)容是操作命令; RDB 文件的內(nèi)容是二進制數(shù)據(jù)。本文將討論RDB快照的原理和使用

一、概述

所謂的快照,就是記錄某一個瞬間東西,比如當我們給風景拍照時,那一個瞬間的畫面和信息就記錄到了一張照片。

所以,RDB 快照就是記錄某一個瞬間的內(nèi)存數(shù)據(jù),記錄的是實際數(shù)據(jù),而 AOF 文件記錄的是命令操作的日志,而不是實際的數(shù)據(jù)。

因此在 Redis 恢復數(shù)據(jù)時, RDB 恢復數(shù)據(jù)的效率會比 AOF 快些,因為直接將 RDB 文件讀入內(nèi)存就可以了,不需要像 AOF 那樣還需要額外執(zhí)行操作命令的步驟才能恢復數(shù)據(jù)。

接下來,就來具體聊聊 RDB 快照 。

二、快照怎么用?

要熟悉一個東西,先看看怎么用是比較好的方式。

Redis 提供了兩個命令來生成 RDB 文件,分別是 savebgsave,他們的區(qū)別就在于是否在「主線程」里執(zhí)行:

  • 執(zhí)行了 save 命令,就會在主線程生成 RDB 文件,由于和執(zhí)行操作命令在同一個線程,所以如果寫入 RDB 文件的時間太長,會阻塞主線程;
  • 執(zhí)行了 bgsava 命令,會創(chuàng)建一個子進程來生成 RDB 文件,這樣可以避免主線程的阻塞;

RDB 文件的加載工作是在服務器啟動時自動執(zhí)行的,Redis 并沒有提供專門用于加載 RDB 文件的命令。

Redis 還可以通過配置文件的選項來實現(xiàn)每隔一段時間自動執(zhí)行一次 bgsava 命令,默認會提供以下配置:

save 900 1

save 300 10

save 60 10000

別看選項名叫 sava,實際上執(zhí)行的是 bgsava 命令,也就是會創(chuàng)建子進程來生成 RDB 快照文件。

只要滿足上面條件的任意一個,就會執(zhí)行 bgsava,它們的意思分別是:

  • 900 秒之內(nèi),對數(shù)據(jù)庫進行了至少 1 次修改;
  • 300 秒之內(nèi),對數(shù)據(jù)庫進行了至少 10 次修改;
  • 60 秒之內(nèi),對數(shù)據(jù)庫進行了至少 10000 次修改。

這里提一點,Redis 的快照是全量快照,也就是說每次執(zhí)行快照,都是把內(nèi)存中的「所有數(shù)據(jù)」都記錄到磁盤中。

所以可以認為,執(zhí)行快照是一個比較重的操作,如果頻率太頻繁,可能會對 Redis 性能產(chǎn)生影響。如果頻率太低,服務器故障時,丟失的數(shù)據(jù)會更多。

通??赡茉O置至少 5 分鐘才保存一次快照,這時如果 Redis 出現(xiàn)宕機等情況,則意味著最多可能丟失 5 分鐘數(shù)據(jù)。

這就是 RDB 快照的缺點,在服務器發(fā)生故障時,丟失的數(shù)據(jù)會比 AOF 持久化的方式更多,因為 RDB 快照是全量快照的方式,因此執(zhí)行的頻率不能太頻繁,否則會影響 Redis 性能,而 AOF 日志可以以秒級的方式記錄操作命令,所以丟失的數(shù)據(jù)就相對更少。

三、執(zhí)行 bgsava 快照時,數(shù)據(jù)能被修改嗎?

那問題來了,執(zhí)行 bgsava 過程中,由于是交給子進程來構建 RDB 文件,主線程還是可以繼續(xù)工作的,此時主線程可以修改數(shù)據(jù)嗎?

如果不可以修改數(shù)據(jù)的話,那這樣性能一下就降低了很多。如果可以修改數(shù)據(jù),又是如何做到到呢?

直接說結(jié)論吧,執(zhí)行 bgsava 過程中,Redis 依然可以繼續(xù)處理操作命令的,也就是數(shù)據(jù)是能被修改的。

那具體如何做到到呢?關鍵的技術就在于寫時復制技術(Copy-On-Write, COW)。

執(zhí)行 bgsava 命令的時候,會通過 fork() 創(chuàng)建子進程,此時子進程和父進程是共享同一片內(nèi)存數(shù)據(jù)的,因為創(chuàng)建子進程的時候,會復制父進程的頁表,但是頁表指向的物理內(nèi)存還是一個。

只有在發(fā)生修改內(nèi)存數(shù)據(jù)的情況時,物理內(nèi)存才會被復制一份。

這樣的目的是為了減少創(chuàng)建子進程時的性能損耗,從而加快創(chuàng)建子進程的速度,畢竟創(chuàng)建子進程的過程中,是會阻塞主線程的。

所以,創(chuàng)建 bgsave 子進程后,由于共享父進程的所有內(nèi)存數(shù)據(jù),于是就可以直接讀取主線程里的內(nèi)存數(shù)據(jù),并將數(shù)據(jù)寫入到 RDB 文件。

當主線程對這些共享的內(nèi)存數(shù)據(jù)也都是只讀操作,那么,主線程和 bgsave 子進程相互不影響。

但是,如果主線程要修改共享數(shù)據(jù)里的某一塊數(shù)據(jù)(比如鍵值對 A)時,就會發(fā)生寫時復制,于是這塊數(shù)據(jù)的物理內(nèi)存就會被復制一份(鍵值對 A'),然后主線程在這個數(shù)據(jù)副本(鍵值對 A')進行修改操作。與此同時,bgsave 子進程可以繼續(xù)把原來的數(shù)據(jù)(鍵值對 A)寫入到 RDB 文件。

就是這樣,Redis 使用 bgsave 對當前內(nèi)存中的所有數(shù)據(jù)做快照,這個操作是由 bgsave 子進程在后臺完成的,執(zhí)行時不會阻塞主線程,這就使得主線程同時可以修改數(shù)據(jù)。

細心的同學,肯定發(fā)現(xiàn)了,bgsave 快照過程中,如果主線程修改了共享數(shù)據(jù),發(fā)生了寫時復制后,RDB 快照保存的是原本的內(nèi)存數(shù)據(jù),而主線程剛修改的數(shù)據(jù),是被辦法在這一時間寫入 RDB 文件的,只能交由下一次的 bgsave 快照。

所以 Redis 在使用 bgsave 快照過程中,如果主線程修改了內(nèi)存數(shù)據(jù),不管是否是共享的內(nèi)存數(shù)據(jù),RDB 快照都無法寫入主線程剛修改的數(shù)據(jù),因為此時主線程的內(nèi)存數(shù)據(jù)和子線程的內(nèi)存數(shù)據(jù)已經(jīng)分離了,子線程寫入到 RDB 文件的內(nèi)存數(shù)據(jù)只能是原本的內(nèi)存數(shù)據(jù)。

如果系統(tǒng)恰好在 RDB 快照文件創(chuàng)建完畢后崩潰了,那么 Redis 將會丟失主線程在快照期間修改的數(shù)據(jù)。

另外,寫時復制的時候會出現(xiàn)這么個極端的情況。

在 Redis 執(zhí)行 RDB 持久化期間,剛 fork 時,主進程和子進程共享同一物理內(nèi)存,但是途中主進程處理了寫操作,修改了共享內(nèi)存,于是當前被修改的數(shù)據(jù)的物理內(nèi)存就會被復制一份。

那么極端情況下,如果所有的共享內(nèi)存都被修改,則此時的內(nèi)存占用是原先的 2 倍。

所以,針對寫操作多的場景,我們要留意下快照過程中內(nèi)存的變化,防止內(nèi)存被占滿了。

四、RDB 和 AOF 合體

盡管 RDB 比 AOF 的數(shù)據(jù)恢復速度快,但是快照的頻率不好把握:

如果頻率太低,兩次快照間一旦服務器發(fā)生宕機,就可能會比較多的數(shù)據(jù)丟失; 如果頻率太高,頻繁寫入磁盤和創(chuàng)建子進程會帶來額外的性能開銷。

那有沒有什么方法不僅有 RDB 恢復速度快的優(yōu)點和,又有 AOF 丟失數(shù)據(jù)少的優(yōu)點呢?

當然有,那就是將 RDB 和 AOF 合體使用,這個方法是在 Redis 4.0 提出的,該方法叫混合使用 AOF 日志和內(nèi)存快照,也叫混合持久化。

如果想要開啟混合持久化功能,可以在 Redis 配置文件將下面這個配置項設置成 yes:

aof-use-rdb-preamble yes

混合持久化工作在 AOF 日志重寫過程。

當開啟了混合持久化時,在 AOF 重寫日志時,fork 出來的重寫子進程會先將與主線程共享的內(nèi)存數(shù)據(jù)以 RDB 方式寫入到 AOF 文件,然后主線程處理的操作命令會被記錄在重寫緩沖區(qū)里,重寫緩沖區(qū)里的增量命令會以 AOF 方式寫入到 AOF 文件,寫入完成后通知主進程將新的含有 RDB 格式和 AOF 格式的 AOF 文件替換舊的的 AOF 文件。

也就是說,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量數(shù)據(jù),后半部分是 AOF 格式的增量數(shù)據(jù)。

這樣的好處在于,重啟 Redis 加載數(shù)據(jù)的時候,由于前半部分是 RDB 內(nèi)容,這樣加載的時候速度會很快。

加載完 RDB 的內(nèi)容后,才會加載后半部分的 AOF 內(nèi)容,這里的內(nèi)容是 Redis 后臺子進程重寫 AOF 期間,主線程處理的操作命令,可以使得數(shù)據(jù)更少的丟失。

以上就是淺談Redis RDB快照的詳細內(nèi)容,更多關于Redis RDB的資料請關注腳本之家其它相關文章!

相關文章

  • 基于Redis分布式鎖的實現(xiàn)代碼

    基于Redis分布式鎖的實現(xiàn)代碼

    這篇文章主要介紹了Redis分布式鎖的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Windows環(huán)境部署Redis集群

    Windows環(huán)境部署Redis集群

    這篇文章主要為大家詳細介紹了Windows環(huán)境部署Redis集群的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案

    詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案

    緩存可以比喻為防彈衣,但如果沒有使用好這個防彈衣效果就會適得其反,所以要更好的使用緩存才能發(fā)揮出它的作用。本文詳細講解了緩存穿透/擊穿/雪崩以及其解決方法,感興趣的小伙伴可以學習一下這篇文章
    2021-09-09
  • Redis中秒殺場景下超時與超賣問題的解決方案

    Redis中秒殺場景下超時與超賣問題的解決方案

    當我們在linux中使用ab來模擬高并發(fā)秒殺時可能會遇到兩種問題,“超時和超賣”,本文就詳細介紹了Redis中秒殺場景下超時與超賣問題的解決方案,感興趣的可以了解一下
    2022-05-05
  • Redis 哨兵機制及配置實現(xiàn)

    Redis 哨兵機制及配置實現(xiàn)

    本文主要介紹了Redis 哨兵機制及配置實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis中哈希結(jié)構(Dict)的實現(xiàn)

    Redis中哈希結(jié)構(Dict)的實現(xiàn)

    本文主要介紹了Redis中哈希結(jié)構(Dict)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 關于使用IDEA的springboot框架往Redis里寫入數(shù)據(jù)亂碼問題

    關于使用IDEA的springboot框架往Redis里寫入數(shù)據(jù)亂碼問題

    這篇文章主要介紹了用IDEA的springboot框架往Redis里寫入數(shù)據(jù)亂碼問題,本文給大家分享解決方法通過圖文示例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Redis整合MySQL主從集群的示例代碼

    Redis整合MySQL主從集群的示例代碼

    本文主要介紹了Redis整合MySQL主從集群的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redis實現(xiàn)布隆過濾器的代碼詳解

    Redis實現(xiàn)布隆過濾器的代碼詳解

    布隆過濾器(Bloom?Filter)是Redis?4.0版本提供的新功能,它被作為插件加載到Redis服務器中,給Redis提供強大的去重功能,本文將給大家詳細介紹一下Redis布隆過濾器,文中有相關的代碼示例,需要的朋友可以參考下
    2023-07-07
  • redis內(nèi)部數(shù)據(jù)結(jié)構之SDS簡單動態(tài)字符串詳解

    redis內(nèi)部數(shù)據(jù)結(jié)構之SDS簡單動態(tài)字符串詳解

    SDS是Redis中實現(xiàn)的一種數(shù)據(jù)結(jié)構,用來存儲字符串,最近學習中正好學習到了這里,所以下面這篇文章主要給大家介紹了redis內(nèi)部數(shù)據(jù)結(jié)構之SDS簡單動態(tài)字符串的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11

最新評論