【go-cache】快速使用

介绍

go-cache 是一个内存中的 key:value 存储/缓存,类似于 memcached,适用于在单机上运行的应用程序。

它的主要优点是,本质上是一个具有过期时间的线程安全的 map[string]interface{},它不需要序列化或通过网络传输其内容。

任何对象都可以在给定的持续时间内或永远存储,并且缓存可以被多个 goroutine 安全地使用。

尽管 go-cache 并不打算用作持久数据存储,但可以将整个缓存保存到文件中并从文件中加载,以快速从停机中恢复。
使用 c.Items() 检索要序列化的项目映射;
使用 NewFrom() 从反序列化的缓存中创建缓存。

安装

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

使用

package main

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

func main() {
    // 创建一个默认过期时间为 5 分钟的缓存,每 10 分钟清除一次过期项目
    c := cache.New(5*time.Minute, 10*time.Minute)

    // 使用默认过期时间,将 key "foo" 的 vaule 设置为 "bar"
    c.Set("foo", "bar", cache.DefaultExpiration)

    // 将 key "baz" 的 vaule 设置为 42,并设置为永不过期
    // (这个 item 将不会被移除,直到缓存被重置,或者通过 c.Delete("baz") 移除。)
    c.Set("baz", 42, cache.NoExpiration)

    // 从缓存中获取与 key "foo" 关联的字符串
    v1, found := c.Get("foo")
    if found {
        fmt.Printf("v1: %s\n", v1)
    }

    // 因为 Go 是静态类型的,并且缓存值可以是任何东西,
    // 所以当值被传递给不采用任意类型的函数(即 interface{})时,需要类型断言。
    // 对只会使用一次的值,执行此操作的最简单方法是:
    // 示例 传递一个值给函数
    v2, found := c.Get("foo")
    if found {
        MyFunction(v2.(string))
    }

    // 如果在同一个函数中多次使用该值,这将变得乏味。
    // 可以改为执行以下任一操作:
    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

返回具有 给定默认过期持续时间 和 清理间隔 的新缓存。
如果过期持续时间小于 1(或 NoExpiration),则缓存中的项目永不过期(默认情况下),必须手动删除。
如果清理间隔小于 1,则在调用 c.DeleteExpired() 之前不会从缓存中删除过期项。

NewFrom

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

返回具有 给定默认过期持续时间 和 清理间隔 的新缓存。
如果过期持续时间小于 1(或 NoExpiration),则缓存中的项目永不过期(默认情况下),必须手动删除。
如果清理间隔小于 1,则在调用 c.DeleteExpired() 之前不会从缓存中删除过期项。

NewFrom() 还接受一个 items map,它将作为缓存的底层 map。
这对于从反序列化缓存开始(使用例如 c.Items() 上的 gob.Encode() 进行序列化),
或传入例如 make(map[string]Item, 500) 以在缓存预计达到某个最小大小时提高启动性能。

只有缓存的方法会同步对该 map 的访问,因此不建议在创建缓存后保留对 map 的任何引用。
如果需要,可以稍后使用 c.Items() 访问该地图(受同样的警告。)

关于序列化的注意事项:
当使用例如 gob,请确保在对使用 c.Items() 检索的映射进行编码之前对存储在缓存中的各个类型进行 gob.Register(),并在解码包含项目映射的 blob 之前注册这些相同的类型。

Cache


Add

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

仅当给定 key 的 item 尚不存在, 或现有 item 已过期时,才将 item 添加到缓存中。 否则返回错误。

Set

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

将 item 添加到缓存中,替换任何现有 item。
如果持续时间为 0 (DefaultExpiration),则使用缓存的默认过期时间。
如果为 -1(NoExpiration),则该 item 永不过期。

SetDefault

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

使用默认过期时间将 item 添加到缓存,替换任何现有 item。


Delete

func (c Cache) Delete(k string)

从缓存中删除一个 item。 如果 key 不在缓存中,则不执行任何操作。

DeleteExpired

func (c Cache) DeleteExpired()

从缓存中删除所有过期的 item。

Flush

func (c Cache) Flush()

从缓存中删除所有 item。

OnEvicted

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

设置从缓存中逐出 item 时使用 key 和 value 调用的(可选)函数。
(包括手动删除时,但不包括覆盖时。)设置为 nil 以禁用。


Replace

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

仅当缓存 key 已存在且现有 item 未过期时才为其设置新值。 否则返回错误。


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,如果设置了过期时间(如果 item 永不过期,则返回 time.Time 的零值),以及指示是否找到键的布尔值。

ItemCount

func (c Cache) ItemCount() int

返回缓存中的项目数。 这可能包括已过期但尚未清理的项目。

Items

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

将缓存中所有未过期的 item 复制到新 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 的值不是整数、未找到、或无法将其递减 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 的值不是整数、未找到或无法将其增加 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容