參考
groupcache源碼解析-概覽
consistent hash(一致性哈希算法)
Memcached大家應(yīng)該都不陌生,官網(wǎng)的介紹是:Free & open source, high-performance, distributed memory object caching system(免費(fèi),開(kāi)源,高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng))。很多公司的產(chǎn)品都用到了Memcached,不過(guò)Memcached是用C語(yǔ)言開(kāi)發(fā)的,我們的目的是提升Golang技能,所以這里我找了Golang版本的Memcached:groupcache來(lái)分析。
github地址:https://github.com/golang/groupcache
github上對(duì)groupcahe的介紹是:groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases.也就是說(shuō)這是一個(gè)庫(kù),目標(biāo)是在很多場(chǎng)景下替代memcached.等看完源碼我們?cè)俜催^(guò)來(lái)看groupcache有哪些優(yōu)秀的特性,對(duì)比來(lái)看官方介紹里的一堆特性介紹。
一、項(xiàng)目概覽

咋一看不太直觀,consistenthash是一致性哈希,groupcachepb應(yīng)該是和Protocol Buffers有關(guān)系,lru是最近最少使用淘汰算法,singleflight是單航班,什么是單航班后面看了代碼再來(lái)理解吧~,testpb和groupcachepb一樣,pb結(jié)尾和Protocol Buffers逃脫不了干系了。剩下的一堆根目錄的源碼文件啥的肯定是各種調(diào)用上面說(shuō)到的幾個(gè)包,所以這里我們先看最上面的5個(gè)文件夾(package)分別是什么內(nèi)容,分模塊攻破之后再看外層調(diào)用邏輯,把知識(shí)點(diǎn)再串聯(lián)到一起。
groupchace明顯比cache2go知識(shí)量大,源碼中至少包含了以下知識(shí)點(diǎn),大家可以提前Google一下這些知識(shí)點(diǎn),比如rpc是什么,golang中如何使用rpc;protobuf怎么用,ring hash(一致性哈希)算法原理,lru算法原理等,singleflight是一種編程技巧,看了源碼我們?cè)賮?lái)體會(huì)其中妙處。
二、一致性哈希算法
關(guān)于哈希算法,可以參考hash算法
關(guān)于一致性哈希算法,強(qiáng)烈建議閱讀白話解析consistent hash 一致性哈希算法
看一下第一個(gè)package:【package consistenthash】的內(nèi)容


從上圖我們可以看到,這里只需要關(guān)注consistenthash.go這源碼文件,里面有2個(gè)類型:Hash和Map,1個(gè)函數(shù)New,Map類型有4個(gè)不可導(dǎo)出的屬性以繼3個(gè)綁定的方法。
下面一個(gè)個(gè)看吧~
1、類型Hash(需要記得Hash是一個(gè)函數(shù)類型哦)。

2、Map類型(Map類型的第一個(gè)屬性就是上面的Hash類型變量hash,replicas屬性表示的是副本數(shù),還記得上面我們提到的為了解決平衡性問(wèn)題而引入的虛擬節(jié)點(diǎn)的概念嗎?這些虛擬節(jié)點(diǎn)這是這里描述的副本數(shù))。

3、New()函數(shù)(這個(gè)函數(shù)明顯就是用來(lái)獲取上面的Map類型變量實(shí)例的,初始化副本數(shù)、hash函數(shù)、hashMap表,hashMap表的key是一個(gè)表示cache服務(wù)器或者副本的hash值,value為一個(gè)具體的cache服務(wù)器,這樣就完成了Cache A、Cache A1、Cache A2等副本全部映射到Cache A的功能。

4、IsEmpty()函數(shù)(這個(gè)函數(shù)就沒(méi)啥可講的了,非空判斷)

5、Add()函數(shù)(將緩存服務(wù)器加到Map中,比如Cache A、Cache B作為keys,如果副本數(shù)指定的是2,那么Map中存的數(shù)據(jù)是Cache A#1、Cache A#2、Cache B#1、Cache B#2的hash結(jié)果)

6、Get()函數(shù)(這個(gè)函數(shù)相對(duì)復(fù)雜一點(diǎn),比如有一個(gè)數(shù)據(jù):name="張三"這條數(shù)據(jù)需要存,這時(shí)候通過(guò)這個(gè)函數(shù)選擇一個(gè)cache服務(wù)器,返回的string類型可以是服務(wù)器ip,比如:"192.168.0.1",從而調(diào)用者能夠?qū)ame="張三"存到"192.168.0.1"上)
