4

我正在使用 redis 开发一个键值存储。我建议使用 a hashmapof type String(key)-->Object(value)。建议我serilaize使用protobuf.

如果我们要使用 Java(独立于平台)填充和读取这些数据,那么使用 有什么好处protobuf吗?只是将对象直接放入redis并取回并转换它会导致任何问题吗?

这个产品非常强调效率,所以我们不想做任何不必要的处理。

4

1 回答 1

11

redis 完全没有必要使用 protobuf;关键通常很简单:选择一个能够在今天、明天和明年可靠地取回数据的序列化框架。您也可以使用 json、xml 等。在许多情况下,单个字符串值绰绰有余,完全绕过序列化(除非您将“编码”视为序列化)。

我通常建议不要使用平台专有的序列化,因为如果您需要在几年内将数据恢复到(比如)C++ 中,它们可能对您没有帮助,而且它们在版本控制方面通常不太灵活。

Protobuf 是一个合理的选择,因为它具有以下关键特性:

  • 小输出(减少应用程序和 redis 之间的带宽,以及存储需求)
  • CPU 高效处理(减少应用程序中的处理)
  • 专为版本公差而设计
  • 跨平台

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

在我们自己使用 redis 时,我们确实碰巧使用了 protobuf,但我们也做了一个推测性的“protobuf 输出是否使用 gzip 压缩?” - 如果是,我们发送 gzip 数据(或者如果更小,我们存储原始未压缩数据 - 显然是一个标记来说明它是哪个)。

于 2012-06-06T10:16:11.417 回答