番外篇 spymemcached原始碼分析

2021-09-22 01:13:37 字數 2728 閱讀 9912

memcached是款優秀的分布式快取工具。spymemcached的底層實現nio.從眾多招聘**,看出nio是眾多公司的硬性要求了。研究下spymemcached原始碼,對開發工程師提高自身nio功底是非常不錯的實踐。

1.剖析memcachedconnection 物件

1.1類圖

memcachedconnection -是spymemcached的核心元件,表示到多台 mc 節點的連線 。本身是個執行緒物件。負責處理操作請求。

memcachedconnection 若干重要屬性:

shouldoptimize - 是否需要優化多個連續的get操作 --> gets 預設true

addedqueue - 用來記錄排隊到節點的操作

selector

- 監控到多個 mc 伺服器的讀寫事件

locator

- 定位某個 mc 伺服器

memcachedclient

:是對外提供的api,底層實現主要由memcachedconnection 提供。

memcachedclient若干重要屬性:

mconn

- memcachedconnection 

opfact

- 操作工廠

transcoder

- 解碼器

tcservice

- 解碼執行緒池服務

connfactory

- 連線工廠

operation - 所有操作的基本介面。memcachedconnection與memcachednode的資訊傳遞單元。乙個相同的操作分別按照不同協議,提供不同實現。

2.剖析memcachednode物件『

memcachednode:定義到 單個memcached 伺服器的連線。與配合nio ,負責具體請求處理。

主要實現:  

tcpmemcachednodeimpl - 

asciimemcachednodeimpl - 

binarymemcachednodeimpl -

主要屬性:

socketaddress

- 伺服器位址

rbuf - 讀緩衝區

預設大小 16384

wbuf - 寫緩衝區

預設大小 16384

writeq - 寫佇列

readq - 讀佇列

inputqueue - 輸入佇列 memcachclient新增操作時先新增到 inputqueue中

opqueuemaxblocktime - 操作的最大阻塞時間 預設10秒

reconnectattempt - 重連嘗試次數 

volatile

channel - socket 通道

towrite - 要向socket傳送的位元組數

optimizedop - 

優化後的operation 實現類是optimizedgetimpl

sk - channel註冊到selector後的key

shouldauth

- 是否需要認證 預設 false

authlatch - 認證需要的latch

reconnectblocked- 

defaultoptimeout

- 操作預設超時時間 預設值 2.5秒

continuoustimeout

- 連續超時次數

opfact

- 操作工廠

nodelocator 

- 根據 key hash 值查詢節點

arraymodnodelocator - hash 值和節點列表長度取模,作為下標,簡單的陣列查詢

ketamanodelocator - ketama一致性hash的實現

3.處理序列圖

3.1操作請求寫入

3.2 請求處理過程

當然複雜的協議解析,需要去看operation介面相關。

由於spymemcached底層使用的nio技術,閱讀之前需要清除nio幾個重要概念,buffer,selector,selectkey。個人理解就是迴圈遍歷selectkey,來回註冊事件,分別呼叫write和read方法。

乙個普通的命令,粗略分為四個階段:

(1)connection state changed(建立連線)

(2) transitioned state from write_queued to writing

(3)transitioned state from writing to reading

(4)transitioned state from reading to complete

番外篇 日誌

一套能實現日誌輸出的工具包 日誌 能夠輸出系統執行的狀態,以及執行的時間 能力定製輸出目標 定製輸出格式 攜帶上下文 執行時選擇性輸出 靈活設定 效率高常見的日誌框架 來自這個包org.slf4.private logger logger logge ctory.getlogger user.cla...

動態SQL番外篇

動態 dynamic sql 1.區分靜態sql和動態sql 1 靜態sql 靜態sql指直接嵌入在pl sql塊中的sql語句,靜態sql用於完成特定或固定的任務。select sal from emp where empno 4000 2 動態sql 動態sql執行pl sql塊時動態輸入的sq...

前端開發 nginx番外篇

centos7下nginx開發使用 背景 阿里雲ecs centos7 安裝教程 centos7安裝nginx實戰 需要主意的如下 文中第四步 4.配置編譯引數命令 可以使用.configure help查詢詳細引數 如圖 執行。configure 啟動後檢視 4 檢視是否啟動 ps ef grep...