分布式 分布式場景下面試題

2021-09-26 08:16:58 字數 2128 閱讀 7160

redis相比memcached有哪些優勢:

執行緒模型:

redis 基於 reactor 模式開發了自己的網路事件處理器: 這個處理器被稱為檔案事件處理器(file event handler):

雖然檔案事件處理器以單執行緒方式執行, 但通過使用 i/o 多路復用程式來監聽多個套接字, 檔案事件處理器既實現了高效能的網路通訊模型, 又可以很好地與 redis 伺服器中其他同樣以單執行緒方式執行的模組進行對接, 這保持了 redis 內部單執行緒設計的簡單性。

詳細介紹:redis執行緒模型

分布式鎖的四個條件:

分布式鎖三種實現方式:

redis實現分布式鎖:

if redis.call('get', keys[1]) == ar**[1] then return redis.call('del', keys[1]) else return 0 end
詳細介紹:redis分布式鎖的正確實現方式

可靠性:

從可靠性角度分析,zookeeper可靠性比redis更好。

因為redis有效期不是很好控制,可能會產生有效期延遲,zookeeper就不一樣,因為zookeeper臨時節點先天性可控的有效期,所以相對來說zookeeper比redis更好

zookeeper和redis分布式鎖詳細介紹:為什麼分布式要有分布式鎖!

redis的key過期處理策略

分布式事務用於在分布式系統中保證不同節點之間的資料一致性。

分布式事務的實現有很多種,最具有代表性的是由oracle tuxedo系統提出的xa分布式事務協議。xa協議包含兩階段提交(2pc)和三階段提交(3pc)兩種實現

在xa協議中包含著兩個角色:事務協調者事務參與者

第一階段

作為事務協調者的節點會首先向所有的參與者節點傳送prepare請求。

在接到prepare請求之後,每乙個參與者節點會各自執行與事務有關的資料更新,寫入undo log和redo log。如果參與者執行成功,暫時不提交事務,而是向事務協調節點返回「完成」訊息。

當事務協調者接到了所有參與者的返回訊息,整個分布式事務將會進入第二階段。

第二階段

如果事務協調節點在之前所收到都是正向返回,那麼它將會向所有事務參與者發出commit請求。

接到commit請求之後,事務參與者節點會各自進行本地的事務提交,並釋放鎖資源。當本地事務完成提交後,將會向事務協調者返回「完成」訊息。

當事務協調者接收到所有事務參與者的「完成」反饋,整個分布式事務完成。

第一階段

第二階段

xa兩階段提交的不足

效能問題;xa協議遵循強一致性。在事務執行過程中,各個節點占用著資料庫資源,只有當所有節點準備完畢,事務協調者才會通知提交,參與者提交後釋放資源。這樣的過程有著非常明顯的效能問題。

協調者單點故障問題;事務協調者是整個xa模型的核心,一旦事務協調者節點掛掉,參與者收不到提交或是回滾通知,參與者會一直處於中間狀態無法完成事務。

丟失訊息導致的不一致問題;在xa協議的第二個階段,如果發生區域性網路問題,一部分事務參與者收到了提交訊息,另一部分事務參與者沒收到提交訊息,那麼就導致了節點之間資料的不一致。

xa三階段提交(3pc)

三階段提交在兩提交的基礎上增加了cancommit階段,並且引入了超時機制。一旦事務參與者遲遲沒有接收到協調者的commit請求,會自動進行本地commit。這樣有效解決了協調者單點故障的問題。但是效能問題和不一致的問題仍然沒有根本解決。

分布式面試題(三) 分布式Memachche

q memcached的 cache機制是怎樣的?memcached主要的 cache機制是lru最近最少用演算法 超時失效。當存資料到 memcached中,可以指定該資料在快取中可以呆多久 如果 memcached的記憶體不夠用了,過期的 slabs會優先被替換,接著就輪到老的未被使用的 sla...

面試題 分布式常用技術

一 dubbo dubbo文件說明 dubbo原理 dubbo 集群容錯模式 負載均衡模式 dubbo的特點,8種通訊協議之對比 dubbo 架構圖 以及呼叫過程 dubbo和spring cloud微服務架構比較 dubbo面試題 dubbo admin安裝和使用 springboot整合dubb...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...