Redis面試復習大綱在手面試不慌,講的明明白白!

前言

面試時間將近兩個小時(期間等待二面面試官來面我的時候等了半個多小時)面試官問的東西很多,還挖了好幾個坑,一個技術點套著一個技術點的問,一定要做好萬全的準備。問了一些基本層面上的技術點都答出來了,稍微問深一點我就有點懵了(實戰經驗還是不足)。

回來之后把這些題目做了一個分類并整理出答案(每次去面試的時候面試官問的問題面試結束后我都會做筆記)分為Spring+邏輯算法+MySQL+Java+Redis+并發編程+JVM+RabbitMQ等,接下來分享一下我的這次螞蟻二面面經+一些我的學習筆記。

1. 面試官:工作中使用過Zookeeper嘛?你知道它是什么,有什么用途呢?

小菜雞的我:

  • 有使用過的,使用ZooKeeper作為dubbo的注冊中心,使用ZooKeeper實現分布式鎖
  • ZooKeeper,它是一個開放源碼的分布式協調服務,它是一個集群的管理者,它將簡單易用的接口提供給用戶。
  • 可以基于Zookeeper 實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能
  • Zookeeper的用途:命名服務、配置管理、集群管理、分布式鎖、隊列管理

用途跟功能不是一個意思咩?

2. 面試官:說下什么是命名服務,什么是配置管理,又什么是集群管理吧

小菜雞的我(幸好我刷過面試題),無所畏懼

  • 命名服務就是

    命名服務是指通過指定的名字來獲取資源或者服務地址。Zookeeper可以創建一個全局唯一的路徑,這個路徑就可以作為一個名字。被命名的實體可以是集群中的機器,服務的地址,或者是遠程的對象等。一些分布式服務框架(RPC、RMI)中的服務地址列表,通過使用命名服務,客戶端應用能夠根據特定的名字來獲取資源的實體、服務地址和提供者信息等。

  • 配置管理:

    實際項目開發中,我們經常使用.properties或者xml需要配置很多信息,如數據庫連接信息、fps地址端口等等。因為你的程序一般是分布式部署在不同的機器上(如果你是單機應用當我沒說),如果把程序的這些配置信息保存在zk的znode節點下,當你要修改配置,即znode會發生變化時,可以通過改變zk中某個目錄節點的內容,利用watcher通知給各個客戶端,從而更改配置。

  • 集群管理

    集群管理包括集群監控和集群控制,其實就是監控集群機器狀態,剔除機器和加入機器。zookeeper可以方便集群機器的管理,它可以實時監控znode節點的變化,一旦發現有機器掛了,該機器就會與zk斷開連接,對用的臨時目錄節點會被刪除,其他所有機器都收到通知。新機器加入也是類似醬紫,所有機器收到通知:有新兄弟目錄加入啦。

3. 面試官:你提到了znode節點,那你知道znode有幾種類型呢?zookeeper的數據模型是怎樣的呢?

小菜雞的我(我先想想):

zookeeper的數據模型

ZooKeeper的視圖數據結構,很像Unix文件系統,也是樹狀的,這樣可以確定每個路徑都是唯一的。zookeeper的節點統一叫做znode,它是可以通過路徑來標識,結構圖如下:

znode的4種類型

根據節點的生命周期,znode可以分為4種類型,分別是持久節點(PERSISTENT)、持久順序節點(PERSISTENT_SEQUENTIAL)、臨時節點(EPHEMERAL)、臨時順序節點(EPHEMERAL_SEQUENTIAL)

  • 持久節點(PERSISTENT)

    這類節點被創建后,就會一直存在于Zk服務器上。直到手動刪除。

  • 持久順序節點(PERSISTENT_SEQUENTIAL)

    它的基本特性同持久節點,不同在于增加了順序性。父節點會維護一個自增整性數字,用于子節點的創建的先后順序。

  • 臨時節點(EPHEMERAL)

    臨時節點的生命周期與客戶端的會話綁定,一旦客戶端會話失效(非TCP連接斷開),那么這個節點就會被自動清理掉。zk規定臨時節點只能作為葉子節點。

  • 臨時順序節點(EPHEMERAL_SEQUENTIAL)

    基本特性同臨時節點,添加了順序的特性。

4、面試官:你知道znode節點里面存儲的是什么嗎?每個節點的數據最大不能超過多少呢?

小菜雞的我:

znode節點里面存儲的是什么?

Znode數據節點的代碼如下

public class DataNode implements Record {byte data[];                    Long acl;                       public StatPersisted stat;       private Set<String> children = null; 
}

哈哈,Znode包含了存儲數據、訪問權限、子節點引用、節點狀態信息,如圖:

  • data: znode存儲的業務數據信息
  • ACL: 記錄客戶端對znode節點的訪問權限,如IP等。
  • child: 當前節點的子節點引用
  • stat: 包含Znode節點的狀態信息,比如事務id、版本號、時間戳等等。

每個節點的數據最大不能超過多少呢

為了保證高吞吐和低延遲,以及數據的一致性,znode只適合存儲非常小的數據,不能超過1M,最好都小于1K。

5、面試官:你知道znode節點上的監聽機制嘛?講下Zookeeper watch機制吧。

小菜雞的我:

  • Watcher機制
  • 監聽機制的工作原理
  • Watcher特性總結

Watcher監聽機制

Zookeeper 允許客戶端向服務端的某個Znode注冊一個Watcher監聽,當服務端的一些指定事件觸發了這個Watcher,服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能,然后客戶端根據 Watcher通知狀態和事件類型做出業務上的改變。

可以把Watcher理解成客戶端注冊在某個Znode上的觸發器,當這個Znode節點發生變化時(增刪改查),就會觸發Znode對應的注冊事件,注冊的客戶端就會收到異步通知,然后做出業務的改變。

Watcher監聽機制的工作原理

  • ZooKeeper的Watcher機制主要包括客戶端線程、客戶端 WatcherManager、Zookeeper服務器三部分。
  • 客戶端向ZooKeeper服務器注冊Watcher的同時,會將Watcher對象存儲在客戶端的WatchManager中。
  • 當zookeeper服務器觸發watcher事件后,會向客戶端發送通知, 客戶端線程從 WatcherManager 中取出對應的 Watcher 對象來執行回調邏輯。

Watcher特性總結

  • **一次性:**一個Watch事件是一個一次性的觸發器。一次性觸發,客戶端只會收到一次這樣的信息。
  • 異步的: Zookeeper服務器發送watcher的通知事件到客戶端是異步的,不能期望能夠監控到節點每次的變化,Zookeeper只能保證最終的一致性,而無法保證強一致性。
  • 輕量級: Watcher 通知非常簡單,它只是通知發生了事件,而不會傳遞事件對象內容。
  • 客戶端串行: 執行客戶端 Watcher 回調的過程是一個串行同步的過程。
  • 注冊 watcher用getData、exists、getChildren方法
  • 觸發 watcher用create、delete、setData方法

6、面試官:你對Zookeeper的數據結構都有一定了解,那你講下Zookeeper的特性吧

小菜雞的我:(我背過書,啊哈哈)

Zookeeper 保證了如下分布式一致性特性:

  • 順序一致性:從同一客戶端發起的事務請求,最終將會嚴格地按照順序被應用到 ZooKeeper 中去。
  • 原子性:所有事務請求的處理結果在整個集群中所有機器上的應用情況是一致的,也就是說,要么整個集群中所有的機器都成功應用了某一個事務,要么都沒有應用。
  • 單一視圖:無論客戶端連到哪一個 ZooKeeper 服務器上,其看到的服務端數據模型都是一致的。
  • 可靠性: 一旦服務端成功地應用了一個事務,并完成對客戶端的響應,那么該事務所引起的服務端狀態變更將會被一直保留下來。
  • 實時性(最終一致性): Zookeeper 僅僅能保證在一定的時間段內,客戶端最終一定能夠從服務端上讀取到最新的數據狀態。

7、面試官:你剛提到順序一致性,那zookeeper是如何保證事務的順序一致性的呢?

小菜雞的我:(完蛋了這題不會)

需要了解事務ID,即zxid。ZooKeeper的在選舉時通過比較各結點的zxid和機器ID選出新的主結點的。zxid由Leader節點生成,有新寫入事件時,Leader生成新zxid并隨提案一起廣播,每個結點本地都保存了當前最近一次事務的zxid,zxid是遞增的,所以誰的zxid越大,就表示誰的數據是最新的。

ZXID的生成規則如下:

ZXID有兩部分組成:

  • 任期:完成本次選舉后,直到下次選舉前,由同一Leader負責協調寫入;
  • 事務計數器:單調遞增,每生效一次寫入,計數器加一。

ZXID的低32位是計數器,所以同一任期內,ZXID是連續的,每個結點又都保存著自身最新生效的ZXID,通過對比新提案的ZXID與自身最新ZXID是否相差“1”,來保證事務嚴格按照順序生效的。

8、面試官:你提到了Leader,你知道Zookeeper的服務器有幾種角色嘛?Zookeeper下Server工作狀態又有幾種呢?

小菜雞的我:

Zookeeper 服務器角色

Zookeeper集群中,有Leader、Follower和Observer三種角色

Leader

Leader服務器是整個ZooKeeper集群工作機制中的核心,其主要工作:

  • 事務請求的唯一調度和處理者,保證集群事務處理的順序性
  • 集群內部各服務的調度者

Follower

Follower服務器是ZooKeeper集群狀態的跟隨者,其主要工作:

  • 處理客戶端非事務請求,轉發事務請求給Leader服務器
  • 參與事務請求Proposal的投票
  • 參與Leader選舉投票

Observer

Observer是3.3.0 版本開始引入的一個服務器角色,它充當一個觀察者角色——觀察ZooKeeper集群的最新狀態變化并將這些狀態變更同步過來。其工作:

  • 處理客戶端的非事務請求,轉發事務請求給 Leader 服務器
  • 不參與任何形式的投票

Zookeeper下Server工作狀態

服務器具有四種狀態,分別是 LOOKING、FOLLOWING、LEADING、OBSERVING。

  • 1.LOOKING:尋找Leader狀態。當服務器處于該狀態時,它會認為當前集群中沒有 Leader,因此需要進入 Leader 選舉狀態。
  • 2.FOLLOWING:跟隨者狀態。表明當前服務器角色是Follower。
  • 3.LEADING:領導者狀態。表明當前服務器角色是Leader。
  • 4.OBSERVING:觀察者狀態。表明當前服務器角色是Observer。

9、面試官:你說到服務器角色是基于ZooKeeper集群的,那你畫一下ZooKeeper集群部署圖吧?ZooKeeper是如何保證主從節點數據一致性的呢?

小菜雞的我:

ZooKeeper集群部署圖

ZooKeeper集群是一主多從的結構:

  • 如果是寫入數據,先寫入主服務器(主節點),再通知從服務器。
  • 如果是讀取數據,既讀主服務器的,也可以讀從服務器的。

ZooKeeper如何保證主從節點數據一致性

我們知道集群是主從部署結構,要保證主從節點一致性問題,無非就是兩個主要問題:

  • 主服務器掛了,或者重啟了
  • 主從服務器之間同步數據~

Zookeeper是采用ZAB協議(Zookeeper Atomic Broadcast,Zookeeper原子廣播協議)來保證主從節點數據一致性的,ZAB協議支持崩潰恢復和消息廣播兩種模式,很好解決了這兩個問題:

  • 崩潰恢復:Leader掛了,進入該模式,選一個新的leader出來
  • 消息廣播: 把更新的數據,從Leader同步到所有Follower

Leader服務器掛了,所有集群中的服務器進入LOOKING狀態,首先,它們會選舉產生新的Leader服務器;接著,新的Leader服務器與集群中Follower服務進行數據同步,當集群中超過半數機器與該 Leader服務器完成數據同步之后,退出恢復模式進入消息廣播模式。Leader 服務器開始接收客戶端的事務請求生成事務Proposal進行事務請求處理。

結語

小編也是很有感觸,如果一直都是在中小公司,沒有接觸過大型的互聯網架構設計的話,只靠自己看書去提升可能一輩子都很難達到高級架構師的技術和認知高度。向厲害的人去學習是最有效減少時間摸索、精力浪費的方式。

我們選擇的這個行業就一直要持續的學習,又很吃青春飯。

雖然大家可能經常見到說程序員年薪幾十萬,但這樣的人畢竟不是大部份,要么是有名校光環,要么是在阿里華為這樣的大企業。年齡一大,更有可能被裁。

小編整理的學習資料分享一波!

送給每一位想學習Java小伙伴,用來提升自己。想要資料的可以點擊這里免費獲取
在這里插入圖片描述

我們選擇的這個行業就一直要持續的學習,又很吃青春飯。

雖然大家可能經常見到說程序員年薪幾十萬,但這樣的人畢竟不是大部份,要么是有名校光環,要么是在阿里華為這樣的大企業。年齡一大,更有可能被裁。

小編整理的學習資料分享一波!

送給每一位想學習Java小伙伴,用來提升自己。想要資料的可以點擊這里免費獲取
[外鏈圖片轉存中…(img-SiWUTOWB-1624600978842)]

本文到這里就結束了,喜歡的朋友可以幫忙點贊和評論一下,感謝支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385886.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python sendline_python Pexpect模塊的使用

Pexpect簡介在講解Pexpect之前&#xff0c;我們需要先了解一下Expect這個腳本語言&#xff0c;它是由TCL語言實現的&#xff0c;主要用于人機交互式對話的自動化控制&#xff0c;可以用來完成ssh、ftp、telnet等命令行程序的自動化交互。Pexpect其實就是一個用Python語言實現的…

RocketMQ消息丟失場景及解決辦法,已拿offer入職

前言 當前我們都會說SpringBoot是Spring框架對“約定優先于配置理念的最佳實踐的產物&#xff0c;一個典型的SpringBoot應用本質上其實就是一個基于Spring框架的應用&#xff0c;而如果大家對Spring框架已經了如指掌&#xff0c;那么&#xff0c;在我們一步步揭開SpringBoot微…

java抓rtp包_Wireshark抓取RTP包,還原語音

最近在做基于SIP的VoIP通信研究&#xff0c;使用Wireshark軟件可以對網絡流量進行抓包。VoIP使用RTP協議對語音數據進行傳輸&#xff0c;語音載荷都封裝在RTP包里面。要對傳輸中的語音進行截獲和還原&#xff0c;需要通過Wireshark對RTP包進行分析和解碼。該過程如下&#xff1…

RocketMQ消費者是如何獲取消息的?轉瘋了!

前言 前兩天&#xff0c;我收到了螞蟻金服的offer&#xff0c;從朋友的內推開始面試到拿到最后offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之后&#xff0c;終于拿到了offer。 第1章&#xff1a;Dubbo的簡史、后續的規劃和整體架構大圖 …

java if在內存中_java如何將對象暫存到內存中?

展開全部form表單提交文件&#xff0c;建議用62616964757a686964616fe59b9ee7ad9431333264623862smartupload上傳&#xff0c;暫存在web服務器目錄下&#xff0c;然后稍微一下下面的代碼&#xff0c;ftp上傳后&#xff0c;刪除暫存文件&#xff0c;okimport java.io.File;impor…

K8S+Docker理論與實踐深度集成

前言&#xff1a; 這篇文章主要介紹了26道Spring經典面試題總結(附帶答案)的相關資料,小編在網上看到的覺得挺不錯的&#xff0c;現在分享給大家&#xff0c;希望對你們有所幫助。 另外本人整理收藏了多家公司面試知識點整理 &#xff0c;以及各種Java核心知識點免費分享給大…

java 注解 方法 參數_java在注解中綁定方法參數的解決方案

我們有這樣子的需求&#xff0c;需要記錄用戶操作某個方法的信息并記錄到日志里面&#xff0c;例如&#xff0c;用戶在保存和更新任務的時候&#xff0c;我們需要記錄下用戶的ip&#xff0c;具體是保存還是更新&#xff0c;調用的是哪個方法&#xff0c;保存和更新的任務名稱以…

Kafka的精髓全寫這本“限量筆記”里了

前言 大廠面試真題向來是求職者的最佳練兵場&#xff0c;華為在Java開發工程師招聘中有哪些技術性考察和傾向&#xff1f;那今天咱就給大家分享一下近期的華為5面面經&#xff01; 注&#xff1a;以下所分享的華為面試問題&#xff0c;相關的答案我也整理出來了&#xff0c;且…

gcc是java的什么意思_為什么gcc支持Java而不是C#

我已經seen this question了,我想知道是否有任何技術理由可以證明gcc支持Java但不支持C#.如果我理解,Java也是一種解釋性語言.如果Mono提供C#編譯器和CIL的實現,為什么不能創建一個將C#轉換為IL然后靜態編譯的gcc c#編譯器&#xff1f;解決方法:如果編譯器工具鏈不支持特定語言…

MongoDB數據分布不均的解決方案

前言 算法血拼&#xff1a;Google百度Alibaba字節Tencent網易360拼夕夕美團 不知不覺雙11就來了,轟轟烈烈的秋招也完美結束了,不知算法與數據結構成為了多少小伙伴進擊大廠的絆腳石&#xff1f; 恰好&#xff0c;我這兩天花了點時間&#xff0c;整理了些各大廠&#xff08;G…

Mybatis-plus常用API全套教程

前言 前兩天&#xff0c;我收到了螞蟻金服的offer&#xff0c;從朋友的內推開始面試到拿到最后offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之后&#xff0c;終于拿到了offer。 正文 下文中截圖來源于朋友一個pdf版本的面經&#xff0c;…

我的世界手動選擇java_如何選中路徑-我的世界怎么選擇java路?我的世界怎么選擇java路徑 愛問知識人...

2014-06-03 11:26:47首先確定你安裝了Java&#xff0c;如沒有自行去官網下載最近版本 如果已安裝&#xff0c;打開啟動器&#xff0c;一般的啟動器都有設置選項&#xff0c;在設置里選擇正確的Java路徑或者讓啟動器自行搜索 設置完畢后啟動游戲~全部2014-06-03 11:26:472014-06…

Mycat和Mysql搭建高可用企業數據庫集群

個人背景 如標題所示&#xff0c;我的個人背景非常簡單&#xff0c;Java開發經驗1年半&#xff0c;學歷普通&#xff0c;2本本科畢業&#xff0c;畢業后出來就一直在Crud&#xff0c;在公司每天重復的工作對我的技術提升并沒有什么幫助&#xff0c;但小鎮出來的我也深知自我努…

java過濾器如何操作數據庫_jsp – 使用Java中的過濾器驗證用戶名,密碼(與數據庫聯系)...

String sql”select * from reg where username”user”‘ and pass”pwd”‘”;這是一個非常糟糕的做法.這種方法要求用戶名和密碼都通過請求傳遞普通香草.而且,你有一個SQL注入攻擊漏洞.利用會話,在JSP / Servlet中你有HttpSession.實際上也沒有必要在使用過濾器的每個請求上…

MySQL+Tomcat+JVM,看完還怕面試官

前言 我朋友也是個寫了四年Java代碼的程序員&#xff0c;跟女友已經戀愛多年&#xff0c;最近突然結婚了。 他結婚以前&#xff0c;換了一家公司&#xff0c;咱倆就好久沒見過面了。剛好今天出門辦事碰上了&#xff0c;找了一家店坐一起喝酒聊天。 我聊天時打趣他&#xff1…

java因子分析_因子分析(Factor Analysis)

1 問題之前我們考慮的訓練數據中樣例的個數m都遠遠大于其特征個數n&#xff0c;這樣不管是進行回歸、聚類等都沒有太大的問題。然而當訓練樣例個數m太小&#xff0c;甚至m<多元高斯分布的參數估計公式如下&#xff1a;分別是求mean和協方差的公式&#xff0c;表示樣例&#…

MySQL+多線程+Redis+算法+網絡

開頭 我們面試的時候 &#xff0c;經常會被問這種到問題:Spring中bean的循環依賴怎么解決&#xff1f; Spring中bean的加載過程&#xff1f; spring相關的問題一直是大廠面試常問到的一個問題,也是一直困擾這我們&#xff0c;不知道從哪里下手&#xff0c;今天舉例分析大廠的一…

python 函數進度條怎么_python輸出結果刷新及進度條的實現操作

print函數python輸出主要使用print函數&#xff0c;print函數介紹&#xff1a;print(*objects, sep" ", end"", filesys.stdout, flushFalse)*objects表示要打印的值&#xff0c;表示多個無名參數或需要打印的值&#xff1b;sep" "&#xff0c;對…

MySQL優化原理分析及優化方案總結

前言 今天中午收到我司安全部發了一封郵件&#xff1a;Jackson存在安全漏洞。查了一下&#xff0c;這件事并不算很新鮮了&#xff08;已經過了5天的樣子&#xff09;&#xff0c;本文來聊聊吧。 說起來還蠻戲劇化&#xff1a;阿里云向Jackson官方提交了一個Jackson序列化安全…

MySQL千萬數據量深分頁優化

前言 提到MySQL的事務&#xff0c;我相信對MySQL有了解的同學都能聊上幾句&#xff0c;無論是面試求職&#xff0c;還是日常開發&#xff0c;MySQL的事務都跟我們息息相關。 而事務的ACID&#xff08;即原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durabili…