redigo是用go語言開發的redis客戶端,受到redis官方的推薦。
redigo的原始碼量比較少,也比較清晰易讀。redigo主要做了以下事項
redigo主要使用了go官方的net、io和bufio包,這些包是go對網路連線,i/o,buffered i/o的抽象實現。
在看pool**的過程中,對於如何控制最大連線數,筆者多花了一些時間才看明白。pool使用buffered channel (可緩衝的管道,以下簡稱 buff chan) 來控制最大連線數。
首先看一下活動連線和空閒連線的定義
可以看出,活動連線是包含空閒連線的。
概述部分提到,pool使用buff chan來控制最大連線數,這裡也是原始碼中比較難以理解的地方,需要對go的channel有較深的理解。
go有兩種channel,chan和 buff chan,它們的特性如下
pool利用buff chan的緩衝區長度固定,及讀操作的阻塞等待來控制最大連線數。
redis/
| – redis.go // 定義介面
| – conn.go // 實現redis.go中定義的介面,用於與redis server建立連線
| – -- type conn struct // 鏈結結構體,實現了 redis.go中定義的conn介面
| – -- type dialoptions struct // 撥號選項,包括撥號器、撥號函式,超時配置,tls配置等
| – -- type dialoption struct // 撥號選項設定結構體,只包含函式f,用於修改撥號選項
| – -- func dial // 撥號函式,引數:網路協議,網路位址,撥號選項設定結構體,返回 conn
| – -- func write* // 寫命令函式,用於將命redis指令寫入buffer io
| – reply.go // 將redis返回資料解析成go的資料型別
redis/
| – pool.go // get()用於獲取連線,close()用於歸還連線
| – -- pool.active // 活動連線數,每建立乙個連線(dial)active加1,每關閉(close)乙個連線,active減1
| – -- pool.ch chan struct{} // 用來控制最大的活動連線數
| – -- pool.lazyinit() // 將pool.ch 初始化為buffered channel,長度為pool.maxactive,並將ch填滿
| – -- pool.get() // 先從pool.ch中取出乙個元素,如果最終建立新連線(dial)失敗,再往ch寫入乙個元素
| – -- pool.put() // 往pool.ch寫入資料,所以get讀取資料,put寫入資料
if wait == 1 and maxactive > 0
and maxactive >= maxidle
and maxactive == 3 and maxidle == 2
初始化:ch長度等於maxactive, len(ch)=3
pool.get() 首先從ch讀出資料, 如果新建連線失敗,再向ch寫入資料,len(ch)不變,否則len(ch)-1
get#1-沒有空閒連線,新建連線,len(ch)=2
get#2-沒有空閒連線,新建連線,len(ch)=1
get#3-沒有空閒連線,新建連線,len(ch)=0
get#4-ch空了,所以ch讀操作阻塞,直到有連線被歸還,put()往ch中寫入資料,ch讀阻塞解除,繼續往下獲取空閒連線,否則只能等待。
這保證了最大活動連線數不會超過maxactive。
部分源**
func
(p *pool)
get(
) conn
}return
&activeconn
}func
(p *pool)
get(ctx inte***ce
err(
)error})
(*poolconn,
error
)else}}
// ... ...
}func
(ac *activeconn)
close()
error
func
(p *pool)
put(pc *poolconn, forceclose bool
)error
// 歸還連線後往ch寫入資料
} p.mu.
unlock()
return
nil}
參考鏈結 Fabric 原始碼解析 原始碼目錄解析
這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...
Spring原始碼解析之 Aop原始碼解析(2)
spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...
Integer原始碼解析
public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...