Golang 第三方庫golang-lru基於雙向鏈表實現了三種LRU及變種Cache:LRU,Q2,ARC。LRU算法:若數據已經在緩存中,將其移到隊首,並返回結果。若數據不在緩存中,將新記錄添加到隊首。若緩存超長,清理隊尾緩存數據。
2Q算法有兩個緩存隊列,一個是FIFO隊列,用於保存最近訪問的數據;一個是LRU隊列,用於保存熱點數據。recent 用於保存最近訪問的數據,frequent用於保存熱點數據,recentEvict保存從最近隊列中剔除的數據。當增加一個新記錄時:
如果frequent隊列中存在該數據則更新,否則下一步;
如果recent隊列存在該數據,則將其移至frequent隊列,否則下一步;
如果recentEvict隊列存在該數據,則確保隊列有空間后將其移至frequent,否則下一步;
確保隊列有空閑,並將其添加至recent。
第一步,frequent 長度不變,整個2q Cache長度不變;第二步recent長度減一,frequent長度加一,總長度不變;第三步,recentEvict長度減一,frequent要增加新數據,由於recentEvict不計算在cache size內,總長度加一,所以需要確認隊列是否有空閑,如果沒有則remove oldest;第四步,recent長度加1,總長度加一,需要判斷隊列是否有空閑。
1.安裝緩存庫: go get "github.com/hashicorp/golang-lru"
2.導入緩存庫:import "github.com/hashicorp/golang-lru"
3.創建給定大小3的LRU:kvch, err := lru.New(3)
4.將值添加到緩存:kvch.Add("1", "9")
5.獲得緩存中key對應的value,不存在返回nil,false:kvch.Get("1")
6.獲得緩存長度:Kvch.Len()
示例源碼:閱讀原文,用法文檔:https://godoc.org/github.com/hashicorp/golang-lru#New