最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis分布式緩存方式(RDB、AOF、主從同步)

 更新時(shí)間:2026年03月20日 10:48:33   作者:CHEN5_02  
這篇文章主要介紹了Redis分布式緩存方式(RDB、AOF、主從同步),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. Redis持久化

實(shí)現(xiàn)Redis數(shù)據(jù)持久化有三種方式

  • RDB快照:將數(shù)據(jù)寫入磁盤
  • AOF日志:將命令追加到文件里
  • 混合持久化:混合RDB和AOF的優(yōu)點(diǎn)

1.1 RDB快照

RDB快照又叫做Redis數(shù)據(jù)快照,簡(jiǎn)單來(lái)說(shuō)就是,將數(shù)據(jù)記錄到磁盤中,當(dāng)Redis發(fā)生故障重啟后,可以根據(jù)快照文件進(jìn)行數(shù)據(jù)回復(fù)。

由于RDB保存的是全部數(shù)據(jù),手動(dòng)保存所需時(shí)間可能比較久,會(huì)阻塞線程。因此我們通常使用bgsave即創(chuàng)建一個(gè)子線程去進(jìn)行數(shù)據(jù)備份。

# 900秒內(nèi),如果至少有1個(gè)key被修改,則執(zhí)行bgsave , 如果是save "" 則表示禁用RDB
save 900 1  
save 300 10  
save 60 10000 

RDB在執(zhí)行快照時(shí),數(shù)據(jù)能修改嗎?

可以,RDB中bgsave采用的是Write-on-Copy技術(shù),主線程會(huì)fork一個(gè)子線程并復(fù)制主線程的頁(yè)表,當(dāng)主線程進(jìn)行讀操作時(shí),會(huì)根據(jù)頁(yè)表的映射關(guān)系讀取到磁盤中的數(shù)據(jù)。

當(dāng)主進(jìn)程執(zhí)行寫操作時(shí),會(huì)創(chuàng)建一個(gè)數(shù)據(jù)副本,子進(jìn)程會(huì)把數(shù)據(jù)副本也寫入磁盤。

小結(jié):

RDB方式bgsave的基本流程?

  • fork主進(jìn)程得到一個(gè)子進(jìn)程,共享內(nèi)存空間
  • 子進(jìn)程讀取內(nèi)存數(shù)據(jù)并異步寫入新的RDB文件
  • 用新RDB文件替換舊的RDB文件

RDB會(huì)在什么時(shí)候執(zhí)行?save 60 1000代表什么含義?

  • 默認(rèn)是服務(wù)停止時(shí)
  • 執(zhí)行save和bgsave
  • 代表60秒內(nèi)至少執(zhí)行1000次修改則觸發(fā)RDB

RDB的缺點(diǎn)?

  • RDB執(zhí)行間隔時(shí)間長(zhǎng),兩次RDB之間寫入數(shù)據(jù)有丟失的風(fēng)險(xiǎn)
  • fork子進(jìn)程、壓縮、寫出RDB文件都比較耗時(shí)

1.2 AOF日志

AOF日志是Redis在執(zhí)行完命令后會(huì)把每一個(gè)命令都追加到一個(gè)文件里,當(dāng)Redis重啟后,可以根據(jù)文件里面的命令進(jìn)行數(shù)據(jù)的恢復(fù)。

1.2.1 AOF的三種回寫策略

  • Always:即每執(zhí)行一個(gè)命令就將該命令寫入AOF文件
  • Everysce:每執(zhí)行完一個(gè)命令,將該命令存入緩沖區(qū),每隔1秒就將緩沖區(qū)里的命令一起寫入AOF文件
  • No:每執(zhí)行完一個(gè)命令,將該命令存入緩沖區(qū),再由操作系統(tǒng)決定何時(shí)將命令寫入AOF文件

1.2.2 AOF重寫機(jī)制

當(dāng)AOF文件過(guò)大時(shí)會(huì)觸發(fā)重寫機(jī)制,簡(jiǎn)單來(lái)說(shuō)就是會(huì)讀取數(shù)據(jù)庫(kù)中的鍵值對(duì)數(shù)據(jù),然后將每個(gè)鍵值對(duì)用一條命令記錄到AOF文件中,將重復(fù)的命令合成為一個(gè)命令,全部完成后,再將新的AOF文件替換掉舊的AOF文件,比如:

原本是三個(gè)命令,修改了兩次num但是實(shí)際起作用的只有最后一次修改,并且由于兩次執(zhí)行的都是set操作,因此可以合并為mset。

重寫的過(guò)程:主進(jìn)程創(chuàng)建重寫AOF的子進(jìn)程,父子進(jìn)程共享物理內(nèi)存,重寫子進(jìn)程對(duì)這個(gè)內(nèi)存為只讀,重寫子進(jìn)程會(huì)讀取數(shù)據(jù)庫(kù)里的所有鍵值對(duì),將每個(gè)鍵值對(duì)轉(zhuǎn)化為一條命令。再將命令記錄到重寫日志(新的AOF日志)

與此同時(shí)==主進(jìn)程依然可以進(jìn)行正常命令處理。但是這時(shí)有個(gè)新問(wèn)題:如果主進(jìn)程進(jìn)行了key-value的修改,那主進(jìn)程和子進(jìn)程的內(nèi)存數(shù)據(jù)不一樣了怎么辦?

這里Redis設(shè)置了AOF重寫緩沖區(qū)==,當(dāng)Redis執(zhí)行完一個(gè)命令后,它會(huì)同時(shí)將這個(gè)命令寫入[AOF緩沖區(qū)]和[AOF重寫緩沖區(qū)]

當(dāng)子進(jìn)程執(zhí)行完重寫操作后,會(huì)向主進(jìn)程發(fā)送一條信號(hào),主進(jìn)程收到信號(hào)后會(huì)調(diào)用信號(hào)處理函數(shù),作用是:將AOF重寫緩沖區(qū)的所有內(nèi)容追加到新的AOF文件中,將新的AOF文件覆蓋現(xiàn)在的AOF文件。

1.3 RDB和AOF對(duì)比

1.4 混合持久化

即結(jié)合了RDB與AOF的優(yōu)點(diǎn):AOF前半部分是RDB格式的全量數(shù)據(jù),后半部分是AOF格式。

缺點(diǎn):可讀性差,兼容性差。

2.Redis主從復(fù)制

如果我們將數(shù)據(jù)只存到一個(gè)Redis服務(wù)器當(dāng)中,如果該Redis宕機(jī),就會(huì)造成嚴(yán)重后果。因此我們將數(shù)據(jù)存到多個(gè)服務(wù)器中,其中把數(shù)據(jù)同步到其他服務(wù)器采用的就是Redis主從復(fù)制。

2.1第一次同步

主從服務(wù)器的第一次同步可以分為三個(gè)階段:

  • 第一階段是建立連接、協(xié)商同步
  • 第二階段是主服務(wù)器同步數(shù)據(jù)給從服務(wù)器
  • 第三階段主服務(wù)器發(fā)送新寫操作命令給從服務(wù)器

第一階段:建立連接,協(xié)商同步

  • 當(dāng)執(zhí)行replicaof命令之后,從服務(wù)器向主服務(wù)器發(fā)送psync命令,表示要進(jìn)行數(shù)據(jù)同步。

里面包含兩個(gè)參數(shù):

  • runID:每個(gè)服務(wù)器啟動(dòng)時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)隨機(jī)的runID,它可以用來(lái)與主服務(wù)器的runID進(jìn)行比較,判斷是否相同,如果相同說(shuō)明不是第一次進(jìn)行數(shù)據(jù)同步了,要進(jìn)行增量同步。如果不同說(shuō)明是第一次同步,要進(jìn)行增量同步。
  • offset:用來(lái)標(biāo)記復(fù)制的進(jìn)度
  • 接收到命令后主服務(wù)器會(huì)返回FULLRESYNC命令(執(zhí)行全量同步),里面包含主服務(wù)器的runID,offset

第二階段:主服務(wù)器同步數(shù)據(jù)給從服務(wù)器

  • 主服務(wù)器會(huì)執(zhí)行bgsave命令生成RDB文件,并發(fā)送給從服務(wù)器,從服務(wù)器收到后會(huì)先清空當(dāng)前數(shù)據(jù),然后再載入RDB文件。
  • 此時(shí)主服務(wù)器依然可以正常執(zhí)行命令,但是這期間進(jìn)行的操作并沒(méi)有記錄到RDB文件中,怎么保持主從數(shù)據(jù)的一致呢?

為了保持主從數(shù)據(jù)的一致性,主服務(wù)器將在下面三個(gè)時(shí)間間隔里進(jìn)行的寫操作記錄到replication buffer緩沖區(qū)中

  • 主服務(wù)器生成RDB文件期間
  • 主服務(wù)器發(fā)送RDB文件期間
  • 從服務(wù)器加載RDB文件期間

第三階段:主服務(wù)器發(fā)送新的寫操作給從服務(wù)器

  • 在從服務(wù)器將RDB文件載入后,會(huì)發(fā)送一個(gè)確認(rèn)消息給主服務(wù)器,接著主服務(wù)器會(huì)把relication buffer緩沖區(qū)里的寫操作命令發(fā)送給從服務(wù)器,從服務(wù)器開(kāi)始執(zhí)行來(lái)自主服務(wù)器的寫操作命令。
  • 至此第一次同步結(jié)束,兩者的數(shù)據(jù)一致。

2.2 命令傳播

主從服務(wù)器第一次同步后雙方就會(huì)簡(jiǎn)歷一個(gè)TCP連接,后續(xù)的寫操作可以通過(guò)這個(gè)連接來(lái)將命令傳播給從服務(wù)器

2.3 增量復(fù)制

當(dāng)主從服務(wù)器之間的連接斷開(kāi)后再次重新連接,同步數(shù)據(jù)的過(guò)程叫增量復(fù)制

這里也主要有三個(gè)步驟:

  • 從服務(wù)器向主服務(wù)器發(fā)送psync命令
  • 主服務(wù)器收到命令判斷runID一致后返回CONTINUE命令告訴從服務(wù)器使用增量同步的方式
  • 主服務(wù)器將斷開(kāi)期間主服務(wù)器執(zhí)行的寫命令發(fā)送給從服務(wù)器,從服務(wù)器再執(zhí)行

其中

repl_backlog_buffer,和offset起到關(guān)鍵作用

  • repl_backlog_buffer:環(huán)形緩沖區(qū),用于主從服務(wù)器斷開(kāi)連接后從中找到差異的數(shù)據(jù)
  • offset:標(biāo)記緩沖區(qū)的進(jìn)度,從服務(wù)器的offset標(biāo)記自己到哪了,主服務(wù)器標(biāo)記自己在哪里。

那repl_backlog_buffer里的內(nèi)容是什么時(shí)候?qū)懭氲哪兀?/p>

在主服務(wù)器進(jìn)行命令傳播時(shí),也會(huì)將命令存入repl_backlog_buffer,因此這個(gè)緩沖區(qū)里存放著最近的命令。

主服務(wù)器和從服務(wù)器之間的差,就是增量同步的數(shù)據(jù)

但是如果,主從服務(wù)器之間差的太多,已經(jīng)將從服務(wù)器未同步的數(shù)據(jù)覆蓋掉了,那接下來(lái)將使用全量同步的方式。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Linux安裝Redis、后臺(tái)運(yùn)行、系統(tǒng)自啟動(dòng)的設(shè)置方法

    Linux安裝Redis、后臺(tái)運(yùn)行、系統(tǒng)自啟動(dòng)的設(shè)置方法

    Redis是用C語(yǔ)言編寫的開(kāi)源免費(fèi)的高性能的分布式內(nèi)存數(shù)據(jù)庫(kù),基于內(nèi)存運(yùn)行并支持持久化的NoSQL數(shù)據(jù)庫(kù)。這篇文章主要介紹了Linux安裝Redis、后臺(tái)運(yùn)行、系統(tǒng)自啟動(dòng),需要的朋友可以參考下
    2020-01-01
  • Redis熱點(diǎn)Key問(wèn)題分析與解決方案

    Redis熱點(diǎn)Key問(wèn)題分析與解決方案

    文章主要介紹了Redis熱點(diǎn)Key的概念、危害、產(chǎn)生原因以及如何檢測(cè)和解決熱點(diǎn)Key問(wèn)題,熱點(diǎn)Key會(huì)導(dǎo)致Redis節(jié)點(diǎn)負(fù)載過(guò)高、集群負(fù)載不均、性能下降、數(shù)據(jù)不一致和緩存擊穿等問(wèn)題,解決熱點(diǎn)Key問(wèn)題的方法包括數(shù)據(jù)分片、讀寫分離、緩存預(yù)熱、限流和熔斷降級(jí)
    2025-01-01
  • Redis主從集群切換數(shù)據(jù)丟失的解決方案

    Redis主從集群切換數(shù)據(jù)丟失的解決方案

    這篇文章主要介紹了Redis主從集群切換數(shù)據(jù)丟失的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Redis跳躍表的基本原理和實(shí)現(xiàn)

    Redis跳躍表的基本原理和實(shí)現(xiàn)

    本文主要介紹了Redis跳躍表的基本原理和實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • WINDOWS中REDIS主從配置實(shí)現(xiàn)代碼解析

    WINDOWS中REDIS主從配置實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了WINDOWS中REDIS主從配置實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Redis?腳本和連接命令示例詳解

    Redis?腳本和連接命令示例詳解

    Redis腳本是一種可以實(shí)現(xiàn)復(fù)雜任務(wù)的腳本語(yǔ)言,可以用來(lái)快速履行復(fù)雜任務(wù),靈活處理數(shù)據(jù)管理和管理復(fù)雜的利用場(chǎng)景,這篇文章主要介紹了Redis?腳本和連接命令,需要的朋友可以參考下
    2023-09-09
  • Redis數(shù)據(jù)刪除與淘汰策略從原理到實(shí)戰(zhàn)指南

    Redis數(shù)據(jù)刪除與淘汰策略從原理到實(shí)戰(zhàn)指南

    本文講解了Redis的數(shù)據(jù)刪除與淘汰策略,從基礎(chǔ)概念鋪墊到策略細(xì)節(jié)拆解,再到底層原理和實(shí)戰(zhàn)配置,重點(diǎn)介紹了三種刪除策略(惰性刪除、定期刪除、主動(dòng)刪除)和六種常用淘汰策略(allkeys-lru、volatile-lru、allkeys-lfu、volatile-lfu等),感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • redis實(shí)現(xiàn)分布式session的解決方案

    redis實(shí)現(xiàn)分布式session的解決方案

    session存放在服務(wù)器,關(guān)閉瀏覽器不會(huì)失效,本文主要介紹了redis實(shí)現(xiàn)分布式session的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解Redis SCAN命令實(shí)現(xiàn)有限保證的原理

    詳解Redis SCAN命令實(shí)現(xiàn)有限保證的原理

    這篇文章主要介紹了Redis SCAN命令實(shí)現(xiàn)有限保證的原理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • Redis中跳表的實(shí)現(xiàn)原理分析

    Redis中跳表的實(shí)現(xiàn)原理分析

    Redis中的跳表是一種高效的多層鏈表結(jié)構(gòu),通過(guò)隨機(jī)概率算法決定節(jié)點(diǎn)的層數(shù),從而實(shí)現(xiàn)快速的插入、刪除和查詢操作,跳表的平均時(shí)間復(fù)雜度為O(logn),最差情況為O(n),每個(gè)節(jié)點(diǎn)包含值和指向更高層節(jié)點(diǎn)的指針,以及回退指針以提高操作效率
    2025-02-02

最新評(píng)論

仁布县| 壤塘县| 张家川| 油尖旺区| 阿鲁科尔沁旗| 雅安市| 克东县| 孟连| 通道| 伊吾县| 柳州市| 咸宁市| 抚州市| 彭山县| 盐津县| 平潭县| 五常市| 贡嘎县| 池州市| 张家口市| 宣汉县| 宿松县| 福海县| 商河县| 永定县| 紫阳县| 连云港市| 股票| 黔江区| SHOW| 达州市| 渭源县| 长子县| 赣州市| 扶沟县| 镇远县| 西吉县| 沁水县| 汪清县| 焉耆| 安龙县|