學習一門新的語言最好的方法當然是投入去用,和閱讀別人優秀的**啦,下面的cache2go就是非常適合萌新閱讀的**
caache2go就是乙個快取庫,併發安全,有心跳機制
專案結構如上,其實主要的就是cache.go, cacheitem.go,cachetable.go三個檔案
先看cacheitem.go吧,裡面主要就是key-value鍵值對的資料結構設計
可以看到裡面的key和data都是乙個空介面,因為go中所有資料型別都實現了空介面,所以這個空介面可以接受任何資料的值,對於乙個初學者來說還是比較神奇的一種操作
這是保活的乙個操作,對於剛接觸可能比較疑惑的是加鎖操作,我個人理解就是會變化的資料因為要保證併發安全,所以加鎖是必須的,如果這資料要讀,就加讀鎖,要讀寫,就直接整個鎖
像下面的lifespan是這個資料的生存時間,在整個程式中設定了就不會改動的,自然不需要加鎖,而accesseddon是最後一次訪問時間,每次keepalive()就會改動的,你讀自然是要加讀鎖的,比如你在寫乙個秒殺活動,如果不加鎖,併發量大的話可能很多個使用者都讀到這個一樣的資料,就可能會造成誤差
下面我們看cachetable.go
這個就是整個類似redis的表啦,就是乙個map,非常的粗暴(簡潔)
name就是這個表名字
cleanuptimer相當乙個觸發清理過期資料的觸發器,cleanupinterval就是週期間隔
上面的函式呢就是檢查表中有沒有過期的元素的,有就刪除,沒有就更新下一次什麼時候有元素過期了,就以這個最短的時間作為下一次的間隔嘛,這個也比較好理解,然後過了這麼個間隔再次觸發這個函式刪除過期元素
下面就是新增元素呼叫的函式,如果一開始間隔是0的話就開始呼叫定期清理過期的函式嘛,如果已經不是0,那麼也同樣要呼叫,因為有新元素新增進來了,最短的間隔同樣要更新嘛,比較不懂的是這個addinternal()為啥不也放在add()裡,這樣如果不小心單獨呼叫了addinternal()不是就gg了。。。
剩下的**也沒什麼值得說了,可以自行閱讀交流~
2 go開源cache2go專案筆記 專案介紹
2.go開源cache2go專案筆記 專案介紹 該專案是go物件的快取庫,包含cache過期自動刪除caceh功能等。專案中包含examples資料夾,裡面包含一些使用例子。主目錄就沒有其他資料夾了,剩下的都是go檔案為主了。ps 還有license.txt,readme之類的可以開啟瞅瞅 go檔案...
go原始碼解讀(二)
solve the 2,3,5 problem print all numbers with 2,3,or 5 as factor using channels.使用通道解決2,3,5問題 以2 3或5為因子列印所有數字 test the solution,silently.測試解決方案。packa...
go語言 io原始碼解讀
reader 介面的定義如下 type reader inte cereader 方法 func readfromsource reader io.reader,num int byte,error return p,err 呼叫.read方法 read 介面 入參 byte 陣列p 返回 int型...