go-cache的基本使用场景示例解析(golang cache模块)快来看

随心笔谈11个月前发布 admin
97 0



目录什么是 go-cache使用导入快速开始常量与结构体常量结构体Set()Get()删除其他备份恢复数据

go-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 ,适用于单机应用。具备如下功能:

线程安全,多 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的基本使用场景示例解析的详细内容,更多关于go-cache使用场景示例的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:Go?语言进阶freecache源码学习教程golang?cache带索引超时缓存库实战示例Mango?Cache缓存管理库TinyLFU源码解析django中使用memcached示例详解GoFrame框架gcache的缓存控制淘汰策略实践示例

© 版权声明

相关文章