Go語言緩存LRU庫"github.com/hashicorp/golang-lru"


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM