欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年04月23日 14:30:26   作者:LiP  
這篇文章主要為大家介紹了go-cache的基本使用場景示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是 go-cache

go-cache 是一個輕量級的基于內(nèi)存的 K-V 儲存組件,內(nèi)部實(shí)現(xiàn)了一個線程安全的 map[string]interface{},適用于單機(jī)應(yīng)用。具備如下功能:

  • 線程安全,多 goroutine 并發(fā)安全訪問;
  • 每個 item 可以設(shè)置過期時間(或無過期時間);
  • 自動定期清理過期的 item;
  • 可以自定義清理回調(diào)函數(shù);

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

go-cache 一般用作臨時數(shù)據(jù)緩存來使用,而不是持久性的數(shù)據(jù)存儲。對于某些停機(jī)后快速恢復(fù)的場景,go-cache支持將緩存數(shù)據(jù)保存到文件,恢復(fù)時從文件中將數(shù)據(jù)加載到內(nèi)存。

使用

導(dǎo)入

github.com/patrickmn/go-cache

快速開始

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

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

// 設(shè)置一個鍵值對,采用 New() 時的默認(rèn)過期時間,即 10s 
c.Set("foo", "bar", cache.DefaultExpiration)  

// 設(shè)置一個鍵值對,沒有過期時間,不會自動過期,需要手動調(diào)用 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)  

常量與結(jié)構(gòu)體

常量

const (
    NoExpiration time.Duration = -1    // 無有效時間
    DefaultExpiration time.Duration = 0   // 表示采用默認(rèn)時間
)

這兩個參數(shù)可以用作 New() 函數(shù)的第一個入?yún)ⅲ瑒t默認(rèn)過期時間小于0,意味著添加鍵值對時如果采用默認(rèn)過期時間,則該鍵值對不會過期,因?yàn)?DeleteExpired() 方法會判斷 v.Expiration 是否大于 0,大于 0 時才會自動刪除。如果想刪除需要手動 Delete() 方法。

添加鍵值對,比如執(zhí)行 Set()、Add() 等操作時,這兩個常量也可以作為參數(shù),NoExpiration 表示沒有過期時間,DefaultExpiration 表示采用默認(rèn)的過期時間。

結(jié)構(gòu)體

主要的結(jié)構(gòu)體包括下面這些:

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

type Cache struct {   // 對外使用的 Cache
 *cache  // cache 實(shí)例
}

type cache struct {
 defaultExpiration time.Duration   // 默認(rèn)的過期時間,添加一個鍵值對時如果設(shè)置默認(rèn)的過期時間(即代碼里的 DefaultExpiration)則會使用到該值
 items             map[string]Item   // 存放的鍵值對
 mu                sync.RWMutex   // 讀寫鎖
 onEvicted         func(string, interface{})  // 刪除key時的回調(diào)函數(shù)
 janitor           *janitor  // 定期清理器 定期檢查過期的 Item
}

type janitor struct { // 清理器結(jié)構(gòu)體
 Interval time.Duration // 清理時間間隔
 stop     chan bool     // 是否停止
}

Set()

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

區(qū)別是,Set()不管key是否存在,都配置。Add()只能用于key不存在的情況,否則報(bào)錯,replace是反的,只能用于key存在的情況,否則報(bào)錯。

Get()

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

刪除

刪除操作主要有兩個,執(zhí)行刪除操作的時候都會判斷是否需要執(zhí)行刪除回調(diào)函數(shù)。

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

DeleteExpired() 用于執(zhí)行批量刪除操作,只會刪除已過期的鍵值對。

其他

  • ItemCount(),返回所有數(shù)據(jù)的條數(shù),這里的條數(shù)包括已過期但還未被刪除的數(shù)量;
  • Flush(),清空數(shù)據(jù);
  • Items(),返回?cái)?shù)據(jù)的未過期的數(shù)據(jù),可以使用 NewFrom() 恢復(fù)數(shù)據(jù);

備份恢復(fù)數(shù)據(jù)

雖然 go-cache 比較傾向于當(dāng)做緩存數(shù)據(jù)來使用,但還是提供了備份數(shù)據(jù)和恢復(fù)數(shù)據(jù)的操作,數(shù)據(jù)使用 gob 序列化。

以上就是go-cache的基本使用場景示例解析的詳細(xì)內(nèi)容,更多關(guān)于go-cache使用場景示例的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go 并發(fā)

    詳解Go 并發(fā)

    這篇文章主要介紹了Go 并發(fā)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)go語言,感興趣的朋友可以了解下
    2020-09-09
  • 詳解Golang 推薦的命名規(guī)范

    詳解Golang 推薦的命名規(guī)范

    這篇文章主要介紹了詳解Golang 推薦的命名規(guī)范,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • go語言讀取csv文件并輸出的方法

    go語言讀取csv文件并輸出的方法

    這篇文章主要介紹了go語言讀取csv文件并輸出的方法,實(shí)例分析了go語言操作csv文件的技巧,需要的朋友可以參考下
    2015-03-03
  • Golang time包中的函數(shù)用法詳解

    Golang time包中的函數(shù)用法詳解

    在日常開發(fā)過程中,會頻繁遇到對時間進(jìn)行操作的場景,使用 Golang 中的 time 包可以很方便地實(shí)現(xiàn)對時間的相關(guān)操作,接下來的幾篇文章會詳細(xì)講解 time 包,本文講解一下 time 包中的函數(shù),需要的朋友可以參考下
    2023-08-08
  • Go設(shè)計(jì)模式之備忘錄模式圖文詳解

    Go設(shè)計(jì)模式之備忘錄模式圖文詳解

    備忘錄模式是一種行為設(shè)計(jì)模式, 允許在不暴露對象實(shí)現(xiàn)細(xì)節(jié)的情況下保存和恢復(fù)對象之前的狀態(tài),本文主要通過一些圖片來給大家介紹一下Go的備忘錄模式,需要的朋友可以參考下
    2023-08-08
  • golang語言中wasm 環(huán)境搭建的過程詳解

    golang語言中wasm 環(huán)境搭建的過程詳解

    將 golang 打包為 WASM,通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo ,接下來通過本文給大家介紹golang語言中wasm 環(huán)境搭建的過程,感興趣的朋友一起看看吧
    2021-11-11
  • 下載golang.org/x包的操作方法

    下載golang.org/x包的操作方法

    今天小編就為大家分享一篇下載golang.org/x包的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Go泛型應(yīng)用工廠方法及泛型使用

    Go泛型應(yīng)用工廠方法及泛型使用

    這篇文章主要介紹了Go泛型應(yīng)用工廠方法及泛型使用,結(jié)合工廠方法+泛型方法來看一下泛型到底是如何在業(yè)務(wù)場景中使用的,需要的小伙伴可以參考一下
    2022-07-07
  • Golang實(shí)現(xiàn)超時機(jī)制讀取文件的方法示例

    Golang實(shí)現(xiàn)超時機(jī)制讀取文件的方法示例

    讀寫文件是Go程序的基本任務(wù),包括使用程序查看文件內(nèi)容、創(chuàng)建或修改文件,Go提供了os,ioutil,io以及bufio包實(shí)現(xiàn)文件操作,本文介紹如果在讀文件過程中增加超時機(jī)制,避免文件太大一直占用資源,需要的朋友可以參考下
    2025-01-01
  • golang rate令牌桶源碼分析實(shí)現(xiàn)方式

    golang rate令牌桶源碼分析實(shí)現(xiàn)方式

    這篇文章主要介紹了golang rate令牌桶源碼分析實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論