Golang 短小精干的包 go-cache
go-cache 是什么
go-cache 是 golang 的一个很好用的基于内存缓存的包。他是类似于 memcached 在内存缓存中存储键值对,比较适合应用在单机的应用程序中,如果是分布式服务或者多节点的服务需要考虑类似 redis 的缓存服务。任何对象都可以被存储,可以是给定的时间,也可以是永远的时间,而且这个缓存可以被多个 goroutine 安全地使用。尽管 go-cache 的并不是作为一个持久的数据存储使用而设计的,但是可以通过将缓存内容保存本地文件的方式进行持久化,以便再服务宕机重启之后回复缓存内容,个人并建议次操作,而且现在是容器化的时代,这种操作也不合适。
优点
- 线程安全的
map[string]interface{} - 无需网络传输
- 可以存储任何对象
- 不仅可以设置过期时间,也可以设置为永不过期
缺点
- 不支持持久化
- 不支持分布式
如何使用 go-cache
安装 go-cache
上面介绍了 go-cache 的一些概念,下面我们说一下怎么安装,和其他的 golang 包一样。
go get github.com/patrickmn/go-cache
实例化 cache
import (
"github.com/patrickmn/go-cache"
"time"
)
var Cache = cache.New(5*time.Minute, 5*time.Minute)
怎样设置 cache
go-cache 包中提供了 set 方法设置缓存对现象或者缓存值,缓存被设置之后,就可以通过 go-cache 提供的 get 方法通过缓存 key 获取缓存的数据(对象、值)。
set 方法中有三个参数,分别是,k:缓存的 key,如果 key 已经存在,将会被覆盖;x:被缓存的数据;d:缓存过期时间,如果为 0 将会使用默认缓存时间,也就是实例化时候设置的超时间,如果为 -1 将永远不会过期。
c.Set("foo", "bar", cache.DefaultExpiration)
怎样获取 cache
上面我们已经缓存了数据,现在就可以从内存中取出缓存的数据,也很简单,只要使用 Get 方法就可以获取缓存数据。这个方法有两个返回值,分别是,interface{}:缓存的数据,如果找不到或者缓存过期将会返回 nil;bool:是否找到了缓存的数据,有两种情况可能返回 false,一种是缓存过期,另一种是没有这个过缓存。
foo, found := c.Get("foo")
if found {
fmt.Println(foo)
}
因为 golang 是静态类型,而缓存的数据可以是任意类型,要想获取真实类型的数据就需要进行转换。
if x, found := c.Get("foo"); found {
foo := x.(string)
// ...
}
除了上述的方法,还提供了 SetDefault,Add,Replace,GetWithExpiration,Increment,Increment各种数值类型,Decrement,Decrement各种数值类型,DeleteExpired,OnEvicted,Save,SaveFile,Load,LoadFile,ItemCount,Flush,NewFrom
如果真的想要 go-cache 持久化,又想分布式部署服务,可以将内存缓存重写为基于云厂商的对象存储,例如,华为的 OBS 对象存储服务。
- 点赞
- 收藏
- 关注作者
评论(0)