您好,登錄后才能下訂單哦!
這篇文章主要介紹“go-cache的基本使用場景是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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()配置key/value對,并附上過期時間。有兩個類似的方法Add()和replace()。
區別是,Set()不管key是否存在,都配置。Add()只能用于key不存在的情況,否則報錯,replace是反的,只能用于key存在的情況,否則報錯。
獲取key/value對,并返回是key是否存在且未過期。GetWithExpiration()相較Get()方法多了個返回過期時間的參數。
刪除操作主要有兩個,執行刪除操作的時候都會判斷是否需要執行刪除回調函數。
Delete() 常規刪除,不管是否過期都會刪除。
DeleteExpired() 用于執行批量刪除操作,只會刪除已過期的鍵值對。
ItemCount(),返回所有數據的條數,這里的條數包括已過期但還未被刪除的數量;
Flush(),清空數據;
Items(),返回數據的未過期的數據,可以使用 NewFrom() 恢復數據;
雖然 go-cache 比較傾向于當做緩存數據來使用,但還是提供了備份數據和恢復數據的操作,數據使用 gob 序列化。
關于“go-cache的基本使用場景是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。