【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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容