redigo原始碼解析

2021-09-02 22:00:06 字數 2308 閱讀 1490

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之間...