go-cache的基本使用場景示例解析
什么是 go-cache
go-cache 是一個輕量級的基于內(nèi)存的 K-V 儲存組件,內(nèi)部實現(xiàn)了一個線程安全的 map[string]interface{},適用于單機應用。具備如下功能:
- 線程安全,多 goroutine 并發(fā)安全訪問;
- 每個 item 可以設(shè)置過期時間(或無過期時間);
- 自動定期清理過期的 item;
- 可以自定義清理回調(diào)函數(shù);
這里的 item 指的是 map 里的元素。
go-cache 一般用作臨時數(shù)據(jù)緩存來使用,而不是持久性的數(shù)據(jù)存儲。對于某些停機后快速恢復的場景,go-cache支持將緩存數(shù)據(jù)保存到文件,恢復時從文件中將數(shù)據(jù)加載到內(nèi)存。
使用
導入
github.com/patrickmn/go-cache
快速開始
c := cache.New(10*time.Second, 30*time.Second)
// 默認過期時間10s;清理間隔30s,即每30s會自動清理過期的鍵值對
// 設(shè)置一個鍵值對,過期時間是 3s
c.Set("a", "testa", 3*time.Second)
// 設(shè)置一個鍵值對,采用 New() 時的默認過期時間,即 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 // 表示采用默認時間
)
這兩個參數(shù)可以用作 New() 函數(shù)的第一個入?yún)ⅲ瑒t默認過期時間小于0,意味著添加鍵值對時如果采用默認過期時間,則該鍵值對不會過期,因為 DeleteExpired() 方法會判斷 v.Expiration 是否大于 0,大于 0 時才會自動刪除。如果想刪除需要手動 Delete() 方法。
添加鍵值對,比如執(zhí)行 Set()、Add() 等操作時,這兩個常量也可以作為參數(shù),NoExpiration 表示沒有過期時間,DefaultExpiration 表示采用默認的過期時間。
結(jié)構(gòu)體
主要的結(jié)構(gòu)體包括下面這些:
type Item struct { // 鍵值對
Object interface{} // 存放 K-V 的值,可以存放任何類型的值
Expiration int64 // 鍵值對的過期時間(絕對時間)
}
type Cache struct { // 對外使用的 Cache
*cache // cache 實例
}
type cache struct {
defaultExpiration time.Duration // 默認的過期時間,添加一個鍵值對時如果設(shè)置默認的過期時間(即代碼里的 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不存在的情況,否則報錯,replace是反的,只能用于key存在的情況,否則報錯。
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(),返回數(shù)據(jù)的未過期的數(shù)據(jù),可以使用 NewFrom() 恢復數(shù)據(jù);
備份恢復數(shù)據(jù)
雖然 go-cache 比較傾向于當做緩存數(shù)據(jù)來使用,但還是提供了備份數(shù)據(jù)和恢復數(shù)據(jù)的操作,數(shù)據(jù)使用 gob 序列化。
以上就是go-cache的基本使用場景示例解析的詳細內(nèi)容,更多關(guān)于go-cache使用場景示例的資料請關(guān)注腳本之家其它相關(guān)文章!

