<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          《面試1v1》Redis主從架構(gòu)

          共 2267字,需瀏覽 5分鐘

           ·

          2023-06-26 19:38

          我是 javapub,一名 Markdown 程序員從?????,八股文種子選手。

          《面試1v1》 連載中...

          面試官:Redis主從架構(gòu)是什么?它有什么用?

          候選人: Redis 主從架構(gòu)就是將一臺 Redis 服務(wù)器設(shè)為主服務(wù)器,其他的 Redis 服務(wù)器設(shè)為從服務(wù)器。它的主要用途有:

          1. 高可用:當(dāng)主服務(wù)器發(fā)生故障時,從服務(wù)器可以頂上繼續(xù)提供服務(wù),實(shí)現(xiàn)快速故障遷移。
          2. 負(fù)載均衡:主服務(wù)器處理寫請求,從服務(wù)器處理讀請求,分擔(dān)服務(wù)器壓力。
          3. 數(shù)據(jù)冗余:主服務(wù)器的數(shù)據(jù)可以在從服務(wù)器中備份,防止數(shù)據(jù)丟失。

          面試官:Redis 主從復(fù)制的工作流程是怎樣的?

          候選人: Redis 主從復(fù)制的工作流程如下:

          1. 首次同步:從服務(wù)器連接主服務(wù)器,發(fā)送 sync 命令,主服務(wù)器執(zhí)行 BGSAVE 生成 RDB 文件并發(fā)送給從服務(wù)器,從服務(wù)器載入 RDB 文件并獲得數(shù)據(jù)集。同時主服務(wù)器也發(fā)送從服務(wù)器連接后產(chǎn)生的寫命令給從服務(wù)器,使其狀態(tài)與主服務(wù)器一致。
          2. 命令傳播:主服務(wù)器繼續(xù)接收寫命令,并將寫命令同步給從服務(wù)器。主從服務(wù)器保持?jǐn)?shù)據(jù)一致。
          3. 斷線重連:如果從服務(wù)器因網(wǎng)絡(luò)故障與主服務(wù)器斷開,會自動嘗試重連。重連后再次執(zhí)行同步操作,得到主服務(wù)器最新的數(shù)據(jù)。

          主要的工作流程是:同步階段+命令傳播階段,這兩個階段互相循環(huán),實(shí)現(xiàn)主從復(fù)制和數(shù)據(jù)一致性的效果。

          面試官:主從復(fù)制的同步工作是如何實(shí)現(xiàn)的?能給出源碼分析嗎?

          候選人: 主從復(fù)制的同步工作是在 replicaofCommand() 方法中實(shí)現(xiàn)的:

                
                void?replicaofCommand(client?*c)?{
          ????if?(server.masterhost?==?NULL)?{?//如果是第一次同步
          ????????server.master?=?createClient(NULL);?//連接主機(jī)
          ????????if?(server.master?==?NULL)?{
          ????????????addReplyError(c,"Can't?connect?to?MASTER:?Connection?refused");
          ????????????return;
          ????????}
          ????????/*?AUTH?with?the?master?if?required.?*/
          ????????if?(server.masteruser?&&?server.masterauth)?{
          ????????????...
          ????????}
          ????????/*?Send?SYNC?and?receive?BGSAVE?response.?*/
          ????????server.replstate?=?REDIS_REPL_WAIT_BGSAVE_START;?
          ????????serverLog(REDIS_NOTICE,"Waiting?BGSAVE?from?master");
          ????????if?(syncWithMaster()?!=?REDIS_OK)?{??//?發(fā)送sync命令
          ????????????freeClient(server.master);????????
          ????????????server.master?=?NULL;
          ????????}
          ????}?
          }

          同步工作的流程如下:

          1. 從服務(wù)器連接主服務(wù)器,發(fā)送 sync 命令。
          2. 主服務(wù)器接收到 sync 命令,執(zhí)行 BGSAVE,同時開始緩沖從服務(wù)器斷開期間產(chǎn)生的寫命令。
          3. BGSAVE 完成,主服務(wù)器將 RDB 文件發(fā)送給從服務(wù)器,同時也發(fā)送緩沖的寫命令。
          4. 從服務(wù)器得到 RDB 文件后載入,執(zhí)行寫命令,數(shù)據(jù)同步完成。

          這整個同步過程可以保證從服務(wù)器快速獲取主服務(wù)器的數(shù)據(jù),也為后續(xù)的命令傳播階段奠定基礎(chǔ),主從復(fù)制得以順利進(jìn)行。

          面試官:主從復(fù)制的同步實(shí)現(xiàn),你解釋得很詳細(xì),我現(xiàn)在全明白了!Redis 的主從架構(gòu)以及同步原理,你都理解得非常透徹。

          9c4588aaac88d79c3cc52c3c96fc9ce3.webp

          最近我在更新《面試1v1》系列文章,主要以場景化的方式,講解我們在面試中遇到的問題,致力于讓每一位工程師拿到自己心儀的offer,感興趣可以關(guān)注公眾號JavaPub追更!


          《面試1v1》 連載中...

          瀏覽 46
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  好干干成人免费视频 | 日韩激情视频 | 一卡二卡三卡四卡在线 | 亚洲无码不卡视频在线观看 | 日韩黄色视频大全 |