首頁 > 軟體

go-cache的基本使用場景範例解析

2023-12-07 14:00:11

什麼是 go-cache

go-cache 是一個輕量級的基於記憶體的 K-V 儲存元件,內部實現了一個執行緒安全的 map[string]interface{},適用於單機應用。具備如下功能:

  • 執行緒安全,多 goroutine 並行安全存取;
  • 每個 item 可以設定過期時間(或無過期時間);
  • 自動定期清理過期的 item;
  • 可以自定義清理回撥函數;

這裡的 item 指的是 map 裡的元素。

go-cache 一般用作臨時資料快取來使用,而不是永續性的資料儲存。對於某些停機後快速恢復的場景,go-cache支援將快取資料儲存到檔案,恢復時從檔案中將資料載入到記憶體。

使用

匯入

github.com/patrickmn/go-cache

快速開始

c := cache.New(10*time.Second, 30*time.Second) 
// 預設過期時間10s;清理間隔30s,即每30s會自動清理過期的鍵值對  

// 設定一個鍵值對,過期時間是 3s 
c.Set("a", "testa", 3*time.Second)  

// 設定一個鍵值對,採用 New() 時的預設過期時間,即 10s 
c.Set("foo", "bar", cache.DefaultExpiration)  

// 設定一個鍵值對,沒有過期時間,不會自動過期,需要手動呼叫 Delete() 才能刪除 
c.Set("baz", 42, cache.NoExpiration)  

v, found := c.Get("a") 
fmt.Println(v, found) // testa,true  

<-time.After(5 * time.Second) // 延時5s 

v, found = c.Get("a") // nil,false  
fmt.Println(v, found)  

<-time.After(6 * time.Second) 

v, found = c.Get("foo") // nil,false  
fmt.Println(v, found) 

v, found = c.Get("baz") // 42,true  
fmt.Println(v, found)  

常數與結構體

常數

const (
    NoExpiration time.Duration = -1    // 無有效時間
    DefaultExpiration time.Duration = 0   // 表示採用預設時間
)

這兩個引數可以用作 New() 函數的第一個入參,則預設過期時間小於0,意味著新增鍵值對時如果採用預設過期時間,則該鍵值對不會過期,因為 DeleteExpired() 方法會判斷 v.Expiration 是否大於 0,大於 0 時才會自動刪除。如果想刪除需要手動 Delete() 方法。

新增鍵值對,比如執行 Set()、Add() 等操作時,這兩個常數也可以作為引數,NoExpiration 表示沒有過期時間,DefaultExpiration 表示採用預設的過期時間。

結構體

主要的結構體包括下面這些:

type Item struct {  // 鍵值對
 Object     interface{}     // 存放 K-V 的值,可以存放任何型別的值
 Expiration int64   // 鍵值對的過期時間(絕對時間)
}

type Cache struct {   // 對外使用的 Cache
 *cache  // cache 範例
}

type cache struct {
 defaultExpiration time.Duration   // 預設的過期時間,新增一個鍵值對時如果設定預設的過期時間(即程式碼裡的 DefaultExpiration)則會使用到該值
 items             map[string]Item   // 存放的鍵值對
 mu                sync.RWMutex   // 讀寫鎖
 onEvicted         func(string, interface{})  // 刪除key時的回撥函數
 janitor           *janitor  // 定期清理器 定期檢查過期的 Item
}

type janitor struct { // 清理器結構體
 Interval time.Duration // 清理時間間隔
 stop     chan bool     // 是否停止
}

Set()

Set()設定key/value對,並附上過期時間。有兩個類似的方法Add()和replace()。

區別是,Set()不管key是否存在,都設定。Add()只能用於key不存在的情況,否則報錯,replace是反的,只能用於key存在的情況,否則報錯。

Get()

獲取key/value對,並返回是key是否存在且未過期。GetWithExpiration()相較Get()方法多了個返回過期時間的引數。

刪除

刪除操作主要有兩個,執行刪除操作的時候都會判斷是否需要執行刪除回撥函數。

Delete() 常規刪除,不管是否過期都會刪除。

DeleteExpired() 用於執行批次刪除操作,只會刪除已過期的鍵值對。

其他

  • ItemCount(),返回所有資料的條數,這裡的條數包括已過期但還未被刪除的數量;
  • Flush(),清空資料;
  • Items(),返回資料的未過期的資料,可以使用 NewFrom() 恢復資料;

備份恢復資料

雖然 go-cache 比較傾向於當做快取資料來使用,但還是提供了備份資料和恢復資料的操作,資料使用 gob 序列化。

以上就是go-cache的基本使用場景範例解析的詳細內容,更多關於go-cache使用場景範例的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com