将 golang map[string] 接口存储到数据存储中的最佳方式

Best way to store golang map[string]interface into data store

场景:我有任意 JSON 大小,范围从 300 KB - 6.5 MB 从 MongoDB 读取。因为它有很多 arbitrary/dynamic 数据,所以我不能在 golang 中定义结构类型,所以我使用 map[sting]interface{} 类型。 JSON 数据字符串使用 encoding/json's Unmarshal method. Some what similar to what is mentioned in Generic JSON with interface{}.

解析

问题:但问题是它需要更多时间(大约 30 毫秒到 180 毫秒)将字符串 json 解析为 map[string]interface{}。 (与 php 使用 json_encode/decode / igbinary/ msgpack 解析 json 相比)

问题:请问有什么方法可以预处理后存入缓存吗?

我的意思是将字符串解析为 map[string]interface{} 并将其序列化并存储到某个缓存中,然后当我们检索它时应该不需要太多时间来反序列化并继续执行。

注意:我是 golang 的新手,非常感谢任何建议。谢谢

更新:已经尝试使用Gob, binary built-in package & Msgpack implementation for Golang包进行序列化。运气不好,反序列化时间没有改善。

JSON 的标准库包非常慢。这是有充分理由的:它使用 RTTI 来提供非常灵活且非常简单的接口。因此解组比 PHP 的…

幸运的是,还有一种替代方法,即在您要使用的类型上实现 json.Unmarshaller 接口。如果实现此接口,程序包将使用它而不是其标准方法,因此您可以看到巨大的性能提升。

为了帮助您,出现了一小部分工具,其中:

(这里列出记忆中的主要选手,肯定还有其他的)

这些工具将为您请求的类型生成 json.Unmarshaller 接口的定制实现。使用 go:generate,您甚至可以将它们无缝集成到您的构建步骤中。