groupcache 源碼系列一 consistent hash一致性哈希算法

參考
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)目概覽
image.png

咋一看不太直觀,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)容


image.png

image.png

從上圖我們可以看到,這里只需要關(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ù)類型哦)。


image.png

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


image.png

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的功能。


image.png

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

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é)果)


image.png

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"上)
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【優(yōu)勝路小學(xué)一年級(jí)八班】 班班有讀157天 第九期《鱷魚(yú)公主》第十一天 夏日,撫摸著手中光滑的書(shū)頁(yè),聞著淡...
    shangwu21982閱讀 735評(píng)論 0 2
  • 對(duì)于最近碼字沒(méi)有什么靈感覺(jué)得挺煩惱的,總是想說(shuō)些什么卻不知道該說(shuō)什么好?,F(xiàn)在一個(gè)人走在工大的校園里,天已經(jīng)暗了,感...
    餡兒皇后閱讀 185評(píng)論 0 0
  • 前幾天吃魚(yú)卡著了。并沒(méi)有那種想象中刺痛咳得不行的狀況,喝了杯水壓了下去。 好多事只是想著就怕的不行,可是真經(jīng)歷了也...
    2soul閱讀 137評(píng)論 0 0
  • 在臨走的前一天,我就特別的不愿意讓姥姥和姥爺走,所以呢我就特別的傷心。媽媽就說(shuō)明天早上你就別起床了跟姥姥姥爺...
    作家荷堂閱讀 460評(píng)論 0 0
  • 上一篇文章《揭秘西夏陵》3中我們講到了考古隊(duì)確定了7號(hào)陵的主人為仁孝皇帝,而其他陵墓還無(wú)法確定主人。然而進(jìn)入新世紀(jì)...
    安娜人生物語(yǔ)閱讀 1,542評(píng)論 0 6

友情鏈接更多精彩內(nèi)容