【go-cache】快速使用

介紹

go-cache 是一個內(nèi)存中的 key:value 存儲/緩存,類似于 memcached,適用于在單機上運行的應(yīng)用程序。

它的主要優(yōu)點是,本質(zhì)上是一個具有過期時間的線程安全的 map[string]interface{},它不需要序列化或通過網(wǎng)絡(luò)傳輸其內(nèi)容。

任何對象都可以在給定的持續(xù)時間內(nèi)或永遠存儲,并且緩存可以被多個 goroutine 安全地使用。

盡管 go-cache 并不打算用作持久數(shù)據(jù)存儲,但可以將整個緩存保存到文件中并從文件中加載,以快速從停機中恢復(fù)。
使用 c.Items() 檢索要序列化的項目映射;
使用 NewFrom() 從反序列化的緩存中創(chuàng)建緩存。

安裝

$ go get github.com/patrickmn/go-cache

使用

package main

import (
    "fmt"
    "github.com/patrickmn/go-cache"
    "time"
)

func main() {
    // 創(chuàng)建一個默認過期時間為 5 分鐘的緩存,每 10 分鐘清除一次過期項目
    c := cache.New(5*time.Minute, 10*time.Minute)

    // 使用默認過期時間,將 key "foo" 的 vaule 設(shè)置為 "bar"
    c.Set("foo", "bar", cache.DefaultExpiration)

    // 將 key "baz" 的 vaule 設(shè)置為 42,并設(shè)置為永不過期
    // (這個 item 將不會被移除,直到緩存被重置,或者通過 c.Delete("baz") 移除。)
    c.Set("baz", 42, cache.NoExpiration)

    // 從緩存中獲取與 key "foo" 關(guān)聯(lián)的字符串
    v1, found := c.Get("foo")
    if found {
        fmt.Printf("v1: %s\n", v1)
    }

    // 因為 Go 是靜態(tài)類型的,并且緩存值可以是任何東西,
    // 所以當(dāng)值被傳遞給不采用任意類型的函數(shù)(即 interface{})時,需要類型斷言。
    // 對只會使用一次的值,執(zhí)行此操作的最簡單方法是:
    // 示例 傳遞一個值給函數(shù)
    v2, found := c.Get("foo")
    if found {
        MyFunction(v2.(string))
    }

    // 如果在同一個函數(shù)中多次使用該值,這將變得乏味。
    // 可以改為執(zhí)行以下任一操作:
    if x, found := c.Get("foo"); found {
        v3 := x.(string)
        fmt.Printf("v3: %s\n", v3)

        // ...
    }
    // or
    var v4 string
    if x, found := c.Get("foo"); found {
        v4 = x.(string)
    }
    fmt.Printf("v4: %s\n", v4)
    // ...
    // 然后 foo 可以作為字符串自由傳遞

    // Want performance? Store pointers!
    c.Set("foo", &MyStruct{Msg: "test"}, cache.DefaultExpiration)
    if x, found := c.Get("foo"); found {
        v5 := x.(*MyStruct)
        fmt.Printf("v5: %s\n", v5)
        // ...
    }
}

type MyStruct struct {
    Msg string
}

func MyFunction(msg string) {
    fmt.Println(msg)
}

輸出:


result.png

文檔

New

func New(defaultExpiration, cleanupInterval time.Duration) *Cache

返回具有 給定默認過期持續(xù)時間 和 清理間隔 的新緩存。
如果過期持續(xù)時間小于 1(或 NoExpiration),則緩存中的項目永不過期(默認情況下),必須手動刪除。
如果清理間隔小于 1,則在調(diào)用 c.DeleteExpired() 之前不會從緩存中刪除過期項。

NewFrom

func NewFrom(defaultExpiration, cleanupInterval time.Duration, items map[string]Item) *Cache

返回具有 給定默認過期持續(xù)時間 和 清理間隔 的新緩存。
如果過期持續(xù)時間小于 1(或 NoExpiration),則緩存中的項目永不過期(默認情況下),必須手動刪除。
如果清理間隔小于 1,則在調(diào)用 c.DeleteExpired() 之前不會從緩存中刪除過期項。

NewFrom() 還接受一個 items map,它將作為緩存的底層 map。
這對于從反序列化緩存開始(使用例如 c.Items() 上的 gob.Encode() 進行序列化),
或傳入例如 make(map[string]Item, 500) 以在緩存預(yù)計達到某個最小大小時提高啟動性能。

只有緩存的方法會同步對該 map 的訪問,因此不建議在創(chuàng)建緩存后保留對 map 的任何引用。
如果需要,可以稍后使用 c.Items() 訪問該地圖(受同樣的警告。)

關(guān)于序列化的注意事項:
當(dāng)使用例如 gob,請確保在對使用 c.Items() 檢索的映射進行編碼之前對存儲在緩存中的各個類型進行 gob.Register(),并在解碼包含項目映射的 blob 之前注冊這些相同的類型。

Cache


Add

func (c Cache) Add(k string, x interface{}, d time.Duration) error

僅當(dāng)給定 key 的 item 尚不存在, 或現(xiàn)有 item 已過期時,才將 item 添加到緩存中。 否則返回錯誤。

Set

func (c Cache) Set(k string, x interface{}, d time.Duration)

將 item 添加到緩存中,替換任何現(xiàn)有 item。
如果持續(xù)時間為 0 (DefaultExpiration),則使用緩存的默認過期時間。
如果為 -1(NoExpiration),則該 item 永不過期。

SetDefault

func (c Cache) SetDefault(k string, x interface{})

使用默認過期時間將 item 添加到緩存,替換任何現(xiàn)有 item。


Delete

func (c Cache) Delete(k string)

從緩存中刪除一個 item。 如果 key 不在緩存中,則不執(zhí)行任何操作。

DeleteExpired

func (c Cache) DeleteExpired()

從緩存中刪除所有過期的 item。

Flush

func (c Cache) Flush()

從緩存中刪除所有 item。

OnEvicted

func (c Cache) OnEvicted(f func(string, interface{}))

設(shè)置從緩存中逐出 item 時使用 key 和 value 調(diào)用的(可選)函數(shù)。
(包括手動刪除時,但不包括覆蓋時。)設(shè)置為 nil 以禁用。


Replace

func (c Cache) Replace(k string, x interface{}, d time.Duration) error

僅當(dāng)緩存 key 已存在且現(xiàn)有 item 未過期時才為其設(shè)置新值。 否則返回錯誤。


Get

func (c Cache) Get(k string) (interface{}, bool)

從緩存中獲取一個 item。
返回 item 或 nil,以及指示是否找到 key 的布爾值。

GetWithExpiration

func (c Cache) GetWithExpiration(k string) (interface{}, time.Time, bool)

GetWithExpiration 從緩存中返回一個 item 及其到期時間。
它返回 item 或 nil,如果設(shè)置了過期時間(如果 item 永不過期,則返回 time.Time 的零值),以及指示是否找到鍵的布爾值。

ItemCount

func (c Cache) ItemCount() int

返回緩存中的項目數(shù)。 這可能包括已過期但尚未清理的項目。

Items

func (c Cache) Items() map[string]Item

將緩存中所有未過期的 item 復(fù)制到新 map 中并返回。


Decrement

func (c Cache) Decrement(k string, n int64) error

將 int、int8、int16、int32、int64、uintptr、uint、uint8、uint32 或 uint64、float32 或 float64 類型的項減 n。
如果 item 的值不是整數(shù)、未找到、或無法將其遞減 n,則返回錯誤。
要檢索遞減的值,請使用一種專門的方法,例如 DecrementInt64。

Increment

func (c Cache) Increment(k string, n int64) error

將 int、int8、int16、int32、int64、uintptr、uint、uint8、uint32 或 uint64、float32 或 float64 類型的 item 增加 n。
如果 item 的值不是整數(shù)、未找到或無法將其增加 n,則返回錯誤。
要檢索增加的值,請使用一種專門的方法,例如 IncrementInt64。


Item

Expired

func (item Item) Expired() bool

如果 item 已過期,則返回 true。

參考資料

https://pkg.go.dev/github.com/patrickmn/go-cache
https://blog.csdn.net/EDDYCJY/article/details/116725399

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容