在 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 具有此功能。

阅读剩余部分

相关阅读 >>

使用bklexer进行词法分析

通过协程查找数组中元素

Golang 快速排序与 php 快速排序

聊聊dubbo-Go-proxy的timeoutfilter

手撸Golang 结构型设计模式 代理模式

手撸Golang Go与微服务 net.rpc

Golang找不到package怎么办

Golang slice检查元素是否存在

手把手带你进行Golang环境配置

rabbitmq 入门 (Go) - 1. 简介和安装

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




打赏

取消

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

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

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

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

评论

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