protobuf在redis中是否总是必需的?

4
我正在开发一个使用redis的键值存储库。我建议使用String(key)-->Object(value)类型的hashmap。我被建议使用protobuf对对象进行序列化。
如果我们将使用Java(跨平台)来填充和读取这些数据,是否使用protobuf会有任何优势?直接将对象放入redis并获取它再进行强制类型转换是否会引起问题?
该产品强调效率,因此我们不希望进行任何不必要的处理。
1个回答

11

在redis中,完全没有必要使用protobuf。关键是要选择一个可靠地将数据传递回来的序列化框架,无论是今天、明天还是明年。你也可以使用json、xml等其他格式。在许多情况下,一个单一的字符串值已经足够了,完全省略了序列化(除非您将“编码”视为序列化)。

通常我会建议避免使用特定于平台的序列化方式,因为如果您需要在一年后以(假设)C++的形式获取数据,它可能对您没有帮助,并且通常在版本控制方面较不灵活。

Protobuf 是一个不错的选择,因为它具有以下主要特点:

  • 输出小(减少应用程序和redis之间的带宽以及存储需求)
  • CPU处理效率高(减少应用程序中的处理量)
  • 设计用于版本容错
  • 跨平台

但是,其他序列化器也可以工作。您甚至可以只使用纯文本和redis哈希表,即每个对象属性对应一个哈希属性。但在大多数情况下,您希望获取整个对象,因此简单的“获取”并将数据交给适合的序列化API通常更合适。

在我们自己使用redis时,我们确实使用protobuf,但我们也会进行一些猜测性试验,“protobuf输出是否可以通过gzip压缩?”-如果是,则发送gzip数据(或者如果原始未压缩数据更小,则存储原始未压缩数据-显然有一个标记来表示哪种情况)。


Redis映射中的值只是一个字节数组。是否有像直接将对象放入字节格式并在redis获取操作后转换字节数组那样简单的序列化框架?我需要类似于字符串类getBytes()接口的东西来处理我的对象。 - user1017860

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接