在 BigCache 中存储任意类型(interface{})


本文摘自网络,作者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 具有此功能。

阅读剩余部分

相关阅读 >>

Golang基础数据类型-布尔和字符

docker为什么用Golang开发

你知道为啥不再建议使用Gopath以及如何使用Go modules吗

GoGo语言资料包

Golang判断js文件是否存在

Golang中哪些值是不可以寻址的

Golang出现panic是什么原因

Golang查找文件是否存在的方法

解决Go语言安装air框架时遇到Go: inconsistent vendoring问题

Golang中的map是指针吗

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...