Golang 短小精干的包 go-cache

举报
boyce 发表于 2021/09/24 01:00:57 2021/09/24
【摘要】 - 线程安全的 `map[string]interface{}` - 无需网络传输 - 可以存储任何对象 - 不仅可以设置过期时间,也可以设置为永不过期

go-cache 是什么

go-cachegolang 的一个很好用的基于内存缓存的包。他是类似于 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{}:缓存的数据,如果找不到或者缓存过期将会返回 nilbool:是否找到了缓存的数据,有两种情况可能返回 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 对象存储服务。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。