go-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 ,适用于单机应用。具备如下功能:
线程安全,多 goroutine 并发安全访问;每个 item 可以设置过期时间(或无过期时间);自动定期清理过期的 item;可以自定义清理回调函数;
这里的 item 指的是 map 里的元素。
go-cache 一般用作临时数据缓存来使用,而不是持久性的数据存储。对于某些停机后快速恢复的场景,go-cache支持将缓存数据保存到文件,恢复时从文件中将数据加载到内存。
// 默认过期时间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)
NoExpiration time.Duration=-1 // 无有效时间
DefaultExpiration time.Duration=0 // 表示采用默认时间
)
这两个参数可以用作 New() 函数的第一个入参,则默认过期时间小于0,意味着添加键值对时如果采用默认过期时间,则该键值对不会过期,因为 DeleteExpired() 方法会判断 v.Expiration 是否大于 0,大于 0 时才会自动删除。如果想删除需要手动 Delete() 方法。
添加键值对,比如执行 Set()、Add() 等操作时,这两个常量也可以作为参数,NoExpiration 表示没有过期时间,DefaultExpiration 表示采用默认的过期时间。
主要的结构体包括下面这些:
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使用场景示例的资料请关注脚本之家其它相关文章!