Redis - 存储数据到 Redis 的方式:JSON 字符串 或 序列化的 POJO。

7

我有一个以下类:

    public class Person
       {
           public String name;
           public String age;
       }

我对将Person Map保存到Redis的方法有些困惑:

是采用Java序列化/反序列化对象方法还是尝试将其转换为JSON并存储和相反。

以下是一些考虑点:

  • 序列化和反序列化的成本 VS 映射到Java并转换为JSON的成本
  • Redis所需的JSON和序列化对象的内存要求
  • 压缩:Stream vs Data

    应该选择哪种压缩方式,尽管使用Redish Hash,数据压缩似乎有点困难(不太有益)

一些假设如下:

  • POJO包含许多实例变量
  • 将使用Redis哈希来存储对象

关于序列化成本,Java的序列化/反序列化速度会更快。但是如果您使用它,请不要忘记“serialVersionUID”。关于内存,对于非常小的对象(比如少于5个属性),JSON可能会更小,但对于较大的对象,Java序列化会更小。警告:使用Java序列化将阻止任何其他语言(Python、Ruby、Javascript等)能够从Redis中读取对象。尽管成本更高,但我倾向于使用JSON作为一种语言中立的格式。 - brettw
是的,JSON确实是一个很好的解决方案,特别是当人们想以语言中立的方式进行操作时。我认为序列化的一个重要点是,序列化对象所需的内存大小比JSON格式要大得多,因为它将存储它正在存储的魔术数字类和所有元信息。基准测试表明,内置的序列化速度较慢。https://github.com/eishay/jvm-serializers/wiki - Santosh Joshi
2个回答

4
您应该考虑使用MessagePack,因为它与Redis和Lua完全兼容,可以对JSON进行很好的压缩:http://msgpack.org/。需要一些Lua代码进行压缩和解压缩,但成本应该很小。以下是一个示例:http://gists.fritzy.io/2013/11/06/store-json-as-msgpack。有一个缺乏数据的小基准测试:https://gist.github.com/muga/1119814。仍然应该是您的一个很好的选择,因为您可以在不同的语言中使用它,在redis上得到完全支持,并且它是基于JSON的。

即使使用了MessagePack,也应该考虑在网络流上进行数据压缩,以降低延迟。我刚刚去了以下链接,并考虑到流压缩http://tech.3scale.net/2012/07/25/fun-with-redis-replication/。 - Santosh Joshi
1
中间件不应该知道网络压缩的事情。但是你说得对,如果没有一个能够调整路由器、交换机等设备的网络管理员,你仍然需要在中间件上设计某种形式的网络压缩,尽管这原本不是它的职责。在Java中,在将数据发送到Redis之前仍然可以使用MessagePack,并且应该可以正常工作。你提供的链接很有趣,LUA似乎确实是限制带宽的最佳方式,因为该函数在Redis上本地运行,而不涉及Redis命令之间的网络交互。 - zenbeni
MessagePack 看起来很有趣,我们目前正在使用一个系统,在其中将 Java 序列化对象存储在 Redis 中,看到统计数据/基准测试,我对 MessagePack 非常感兴趣。 - Santosh Joshi
1
你提到的例子将传入的JSON转换为MessagePack进行存储。我对MessagePack也很感兴趣,但是从一开始就以MessagePack格式从客户端传输它会不会更合理呢? - Dave Van den Eynde

2
答案是你应该根据你的使用情况和环境来测量它。我会首先尝试JSON,因为它更加灵活,问题较少 - 例如更容易调试和恢复损坏的数据。
性能。JSON序列化很快,因此在许多情况下,它不会成为瓶颈。最有可能的是磁盘或网络IO: java serialization benchmarking。避免使用默认的Java序列化,因为它很慢。Kryo是二进制输出的选项。如果您需要多个平台的二进制格式,请考虑DB的内部格式或Google Protobuffers。
压缩。在Google中,他们使用Snappy进行较少CPU需求的压缩。Snappy也用于Cassandra、Hadoop和Hypertable。一些JVM压缩器的基准测试:Compression test using Calgary corpus data set

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