介绍
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)
}
输出:
文档
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