我正在使用 redis 开发一个键值存储。我建议使用 a hashmap
of type String(key)-->Object(value)
。建议我serilaize
使用protobuf
.
如果我们要使用 Java(独立于平台)填充和读取这些数据,那么使用 有什么好处protobuf
吗?只是将对象直接放入redis并取回并转换它会导致任何问题吗?
这个产品非常强调效率,所以我们不想做任何不必要的处理。
我正在使用 redis 开发一个键值存储。我建议使用 a hashmap
of type String(key)-->Object(value)
。建议我serilaize
使用protobuf
.
如果我们要使用 Java(独立于平台)填充和读取这些数据,那么使用 有什么好处protobuf
吗?只是将对象直接放入redis并取回并转换它会导致任何问题吗?
这个产品非常强调效率,所以我们不想做任何不必要的处理。
redis 完全没有必要使用 protobuf;关键通常很简单:选择一个能够在今天、明天和明年可靠地取回数据的序列化框架。您也可以使用 json、xml 等。在许多情况下,单个字符串值绰绰有余,完全绕过序列化(除非您将“编码”视为序列化)。
我通常建议不要使用平台专有的序列化,因为如果您需要在几年内将数据恢复到(比如)C++ 中,它们可能对您没有帮助,而且它们在版本控制方面通常不太灵活。
Protobuf 是一个合理的选择,因为它具有以下关键特性:
但是,其他序列化程序也可以工作。您甚至可以只使用纯文本和 redis 哈希,即每个对象属性的哈希属性。但是,在大多数情况下,您想要获取整个对象,因此简单的“获取”并将数据交给合适的序列化 API 通常更合适。
在我们自己使用 redis 时,我们确实碰巧使用了 protobuf,但我们也做了一个推测性的“protobuf 输出是否使用 gzip 压缩?” - 如果是,我们发送 gzip 数据(或者如果更小,我们存储原始未压缩数据 - 显然是一个标记来说明它是哪个)。