本文摘自网络,作者alandtsang,侵删。
这篇文章也发在我的个人 博客
最近在工作中,我的任务是向我们的一个 Golang 服务添加缓存。这个服务需要传入请求以提供用于身份验证的 API key。因此,对于每个请求,该服务都会额外查询数据库以验证 API key,尽管它通常是相同的 key。这很不好。实现缓存最终比我想象的要难得多。
经过调研和工程师之间详尽讨论之后,我们认为 BigCache 最适合我们的需求。
这里有一个问题。BigCache 中的 set 方法的声明为 Set(key string, entry []byte) error
。它期望存储一个 byte slice。但是我们希望存储一个 struct,该 struct 具有多个表示 API key 的字段。这次我们可能只能够存储实际 key 的 bytes。但这只是推迟解决问题。 我们需要的是像其他 Golang 缓存实现中的声明 Set(key, entry interface{})
。这样我们就可以存储任何我们想要的东西。
这个问题的明显解决方案是序列化。如果我们可以将任意结构序列化为 byte slice,那么我们可以存储任何内容。要使用我们存储的结构,可以从缓存中反序列化获取 byte slice。序列化结构就像在 Golang 中导入任意数量的可用 encoding 库一样容易。但是现在头疼的问题来了。当我们反序列化 bytes 时,Go 语言如何知道将数据存入什么类型的结构?事实证明,Golang 特有的序列化库 encoding/gob
具有此功能。
相关阅读 >>
你知道为啥不再建议使用Gopath以及如何使用Go modules吗
解决Go语言安装air框架时遇到Go: inconsistent vendoring问题
更多相关阅读请进入《Go》频道 >>
Go语言101
一个与时俱进的Go编程知识库。