go-cache的基本使用場景示例解析
什么是 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)文章
Golang實(shí)現(xiàn)超時機(jī)制讀取文件的方法示例
讀寫文件是Go程序的基本任務(wù),包括使用程序查看文件內(nèi)容、創(chuàng)建或修改文件,Go提供了os,ioutil,io以及bufio包實(shí)現(xiàn)文件操作,本文介紹如果在讀文件過程中增加超時機(jī)制,避免文件太大一直占用資源,需要的朋友可以參考下2025-01-01golang rate令牌桶源碼分析實(shí)現(xiàn)方式
這篇文章主要介紹了golang rate令牌桶源碼分析實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07