【问题标题】:High performance serialization and deserialization to cache objects in redis高性能序列化和反序列化以缓存redis中的对象
【发布时间】:2015-02-16 12:33:00
【问题描述】:

我们目前正在使用jax-rs 编写一个 REST 服务,我们在其中缓存 DB 实体 (javax.persistence.Entity),即数据库中表的对象表示,在 redis 服务器中。在将对象放入redis之前,我们通过jackson将对象序列化为json,当我们需要实体对象时,我们在从redis获取后反序列化它。

我想知道是否有一种更快/性能更高的方式来进行序列化和反序列化。如果有人建议一种更高效的方式而不将对象转换为人类可读格式(如 json)并且我不想要内部语言互操作性,我可以。

如果有人需要更多详细信息,请告诉我。谢谢。

【问题讨论】:

  • 我对你所说的库只是稍微熟悉,但我想我理解这个问题。在我看来,问题是你总是需要实体吗?您序列化的每个实体都会被反序列化吗?如果是,那么我认为您的解决方案将达到预期效果。如果不是,也许您可​​以使用标准序列化来序列化对象,然后在需要使用它时执行 JSON 传输。
  • 我对上述库也一无所知,但请考虑使用 Redis 的哈希来存储您的实体。这将使您完全无需序列化/反序列化。
  • @ItamarHaber 但是你将如何存储对象,你需要序列化它。对吗?
  • 不一定 - 哈希数据结构包含字段->值映射,这很容易映射到表的行/JSON 格式。一旦您的对象存储在哈希中,您就可以访问各个字段(用于读/写),而无需通过昂贵的反序列化和整个语料库的重新序列化。

标签: java serialization redis jackson


【解决方案1】:

Java 中有很多很多用于序列化对象的库。比如JVM Serializers benchmark,就包括两打左右。

如果这是主要关注点,可以帮助您更快地进行序列化的几件事:

  • 如果您使用 Jackson 数据绑定,请查看 Afterburner 模块:无需更改任何代码即可将处理速度提高 20-30%
  • 尝试二进制 JSON 格式,如 SmileCBOR 与 Jackson(https://github.com/FasterXML/jackson-dataformat-smilehttps://github.com/FasterXML/jackson-dataformat-cbor)。这些不是开发人员可读的,但占用的空间更少,处理速度更快,并且也可以从其他语言中读取(即不是 Java 特定的)
  • 如果与 JSON 结构的兼容性无关紧要,并且您不需要 Java 以外的其他语言的支持,Kryo 是相对成熟的 ser/deser 库,被许多系统使用。

对于 JSON,Jackson 是最快的,虽然在某些情况下其他(Boon、fastjson)可以更快,但您确实需要对您的特定用例进行基准测试以了解您的用例是否是其中之一。但即便如此,差异也不太可能很大。

【讨论】:

    【解决方案2】:

    如果您最终需要所有实体作为 JSON,那么您的方法很好,否则 Robert 已经指出 使用默认序列化

    根据这些基准,jackson 比 java 序列化更快: benchmark

    如果您使用 jackson,我唯一记得的是 ObjectMapper 的创建成本很高。 jackson

    要从中得到最后一点,您可能应该将其他 json 序列化器/解析器与 jackson 进行比较,例如恩惠相当快。 boon

    【讨论】:

    • 如果使用单例对象映射器,您是在说 java 默认序列化比 jackson 快。
    • 我是,但我不确定了。
    • 不,Java 序列化对于单个相对较小的对象来说效率很低。它对于更大的图更有效(相对而言),因为开销的原因是它必须序列化类元数据。对于较大的图表,随着数据与元数据的比例增加,这不是什么大问题。
    【解决方案3】:

    如果您选择 MessagePack,则您在 Redis Lua 脚本中得到支持,因此您将能够执行诸如从 Redis 获取单个字段之类的操作,而无需将整个对象传输回客户端。但是我的 Java 知识非常有限,所以我不知道 MessagePack 是否是 Java 对象的一种可行的序列化格式。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 2021-02-08
      • 2011-04-13
      • 1970-01-01
      • 2016-10-14
      • 2014-12-24
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多