go-cache的基本使用場(chǎng)景示例解析
什么是 go-cache
go-cache 是一個(gè)輕量級(jí)的基于內(nèi)存的 K-V 儲(chǔ)存組件,內(nèi)部實(shí)現(xiàn)了一個(gè)線程安全的 map[string]interface{},適用于單機(jī)應(yīng)用。具備如下功能:
- 線程安全,多 goroutine 并發(fā)安全訪問;
- 每個(gè) item 可以設(shè)置過期時(shí)間(或無過期時(shí)間);
- 自動(dòng)定期清理過期的 item;
- 可以自定義清理回調(diào)函數(shù);
這里的 item 指的是 map 里的元素。
go-cache 一般用作臨時(shí)數(shù)據(jù)緩存來使用,而不是持久性的數(shù)據(jù)存儲(chǔ)。對(duì)于某些停機(jī)后快速恢復(fù)的場(chǎng)景,go-cache支持將緩存數(shù)據(jù)保存到文件,恢復(fù)時(shí)從文件中將數(shù)據(jù)加載到內(nèi)存。
使用
導(dǎo)入
github.com/patrickmn/go-cache
快速開始
c := cache.New(10*time.Second, 30*time.Second)
// 默認(rèn)過期時(shí)間10s;清理間隔30s,即每30s會(huì)自動(dòng)清理過期的鍵值對(duì)
// 設(shè)置一個(gè)鍵值對(duì),過期時(shí)間是 3s
c.Set("a", "testa", 3*time.Second)
// 設(shè)置一個(gè)鍵值對(duì),采用 New() 時(shí)的默認(rèn)過期時(shí)間,即 10s
c.Set("foo", "bar", cache.DefaultExpiration)
// 設(shè)置一個(gè)鍵值對(duì),沒有過期時(shí)間,不會(huì)自動(dòng)過期,需要手動(dòng)調(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) // 延時(shí)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 // 無有效時(shí)間
DefaultExpiration time.Duration = 0 // 表示采用默認(rèn)時(shí)間
)
這兩個(gè)參數(shù)可以用作 New() 函數(shù)的第一個(gè)入?yún)?,則默認(rèn)過期時(shí)間小于0,意味著添加鍵值對(duì)時(shí)如果采用默認(rèn)過期時(shí)間,則該鍵值對(duì)不會(huì)過期,因?yàn)?DeleteExpired() 方法會(huì)判斷 v.Expiration 是否大于 0,大于 0 時(shí)才會(huì)自動(dòng)刪除。如果想刪除需要手動(dòng) Delete() 方法。
添加鍵值對(duì),比如執(zhí)行 Set()、Add() 等操作時(shí),這兩個(gè)常量也可以作為參數(shù),NoExpiration 表示沒有過期時(shí)間,DefaultExpiration 表示采用默認(rèn)的過期時(shí)間。
結(jié)構(gòu)體
主要的結(jié)構(gòu)體包括下面這些:
type Item struct { // 鍵值對(duì)
Object interface{} // 存放 K-V 的值,可以存放任何類型的值
Expiration int64 // 鍵值對(duì)的過期時(shí)間(絕對(duì)時(shí)間)
}
type Cache struct { // 對(duì)外使用的 Cache
*cache // cache 實(shí)例
}
type cache struct {
defaultExpiration time.Duration // 默認(rèn)的過期時(shí)間,添加一個(gè)鍵值對(duì)時(shí)如果設(shè)置默認(rèn)的過期時(shí)間(即代碼里的 DefaultExpiration)則會(huì)使用到該值
items map[string]Item // 存放的鍵值對(duì)
mu sync.RWMutex // 讀寫鎖
onEvicted func(string, interface{}) // 刪除key時(shí)的回調(diào)函數(shù)
janitor *janitor // 定期清理器 定期檢查過期的 Item
}
type janitor struct { // 清理器結(jié)構(gòu)體
Interval time.Duration // 清理時(shí)間間隔
stop chan bool // 是否停止
}
Set()
Set()配置key/value對(duì),并附上過期時(shí)間。有兩個(gè)類似的方法Add()和replace()。
區(qū)別是,Set()不管key是否存在,都配置。Add()只能用于key不存在的情況,否則報(bào)錯(cuò),replace是反的,只能用于key存在的情況,否則報(bào)錯(cuò)。
Get()
獲取key/value對(duì),并返回是key是否存在且未過期。GetWithExpiration()相較Get()方法多了個(gè)返回過期時(shí)間的參數(shù)。
刪除
刪除操作主要有兩個(gè),執(zhí)行刪除操作的時(shí)候都會(huì)判斷是否需要執(zhí)行刪除回調(diào)函數(shù)。
Delete() 常規(guī)刪除,不管是否過期都會(huì)刪除。
DeleteExpired() 用于執(zhí)行批量刪除操作,只會(huì)刪除已過期的鍵值對(duì)。
其他
- 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的基本使用場(chǎng)景示例解析的詳細(xì)內(nèi)容,更多關(guān)于go-cache使用場(chǎng)景示例的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究
這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go語(yǔ)言集成開發(fā)環(huán)境IDE詳細(xì)安裝教程
VSCode是免費(fèi)開源的現(xiàn)代化輕量級(jí)代碼編輯器,支持幾乎所有主流的開發(fā)語(yǔ)言,內(nèi)置命令行工具和 Git 版本控制系統(tǒng),支持插件擴(kuò)展,這篇文章主要介紹了Go語(yǔ)言集成開發(fā)環(huán)境IDE詳細(xì)安裝教程,需要的朋友可以參考下2021-11-11
Go條件控制語(yǔ)句詳解(if-else、switch和select)
條件語(yǔ)句用于檢查一個(gè)條件是否為真,并根據(jù)條件的真假來決定是否執(zhí)行相應(yīng)的代碼,下面這篇文章主要給大家介紹了關(guān)于Go條件控制語(yǔ)句(if-else、switch和select)的相關(guān)資料,需要的朋友可以參考下2024-03-03
Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)
按行讀取文件相較于一次性載入,有著很多優(yōu)勢(shì),如內(nèi)存效率高、處理速度快、實(shí)時(shí)性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對(duì)大家有所幫助2024-02-02
Go語(yǔ)言中實(shí)現(xiàn)完美錯(cuò)誤處理實(shí)踐分享
Go?語(yǔ)言是一門非常流行的編程語(yǔ)言,由于其高效的并發(fā)編程和出色的網(wǎng)絡(luò)編程能力,越來越受到廣大開發(fā)者的青睞。本文我們就來深入探討一下Go?語(yǔ)言中的錯(cuò)誤處理機(jī)制吧2023-04-04

