1. 程式人生 > 其它 >Go語言快取LRU庫"github.com/hashicorp/golang-lru"

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