Java Redis—将数据存储到Redis::JSON字符串或序列化pojo中的方法

Java Redis—将数据存储到Redis::JSON字符串或序列化pojo中的方法,java,json,serialization,redis,Java,Json,Serialization,Redis,我的课程如下: public class Person { public String name; public String age; } 公共阶层人士 { 公共字符串名称; 公共字符串年龄; } 我对将Peron地图保存到Redis的方法有点困惑: 我应该采用java序列化/反序列化对象方法,还是尝试转换为JSON,然后存储,反之亦然 对以下几点有何想法: 序列化和反序列化的成本与映射到Java和JSON的成本 JSON和Redi

我的课程如下:

public class Person { public String name; public String age; } 公共阶层人士 { 公共字符串名称; 公共字符串年龄; } 我对将Peron地图保存到Redis的方法有点困惑:

我应该采用java序列化/反序列化对象方法,还是尝试转换为JSON,然后存储,反之亦然

对以下几点有何想法:

  • 序列化和反序列化的成本与映射到Java和JSON的成本
  • JSON和Redis序列化对象的内存要求
  • 压缩:流与数据

    我们应该选择哪种压缩 虽然数据压缩似乎有点困难(没有多少好处),因为我们使用的是Redish散列

其中一些假设是:

  • pojo包含许多instancd变量
  • 将使用Redis哈希存储对象

答案是,您应该针对您的用例和环境进行度量。我会首先尝试JSON,因为它更通用,问题更少——即更容易调试和恢复损坏的数据

性能。JSON序列化速度很快,因此在许多情况下,它不会成为您的瓶颈。很可能是磁盘或网络IO:。避免使用默认的Java序列化,因为它很慢。是二进制输出的一个选项。如果需要多个二进制格式的平台,请考虑DB的内部格式,即谷歌原始缓冲区。
压缩。在谷歌,他们使用较少的cpu要求的压缩。Snappy还用于Cassandra、Hadoop和Hypertable。JVM压缩器的一些基准::

< P>您应该考虑使用MeasApPACK,因为它与ReIIS和Lua完全兼容,这是JSON上的一个很好的压缩:

这意味着要压缩和解压缩一些Lua代码,但成本应该很小。以下是一个例子:

有一个缺乏数据的小基准:


不过,它对您来说应该是一个很好的选择,因为您可以在不同的语言中使用它,在redis上完全受支持,并且它基于JSON。

Re:序列化成本,Java反序列化/序列化将更快。但是如果您使用它,请不要忘记一个
serialVersionUID
。Re:内存,对于非常小的对象(比如少于5个属性),JSON可能会更小,但是对于更大的对象,Java序列化会更小。警告:使用Java序列化将阻止任何其他类型的语言(Python、Ruby、Javascript等)从Redis读取对象。尽管成本较高,我还是倾向于将JSON作为一种语言中立的格式。是的,JSON确实是一个很好的解决方案,特别是当人们想以语言中立的方式使用JSON时。关于序列化,我还认为序列化对象的大小(所需内存)比JSON格式大得多,因为它将存储它正在存储的幻数类以及所有的元信息。过慢基准测试表明内置的序列化速度很慢。即使使用MessagePack,也应该考虑在网络流上压缩数据,从而减少延迟。我只是转到下面的链接,想到流压缩中间件不应该知道网络压缩。但你是对的,如果没有一个网络管理员可以调整路由器、交换机和其他东西,你将不得不在中间件中设计某种网络压缩,这本来不是它的责任。在java中将数据发送到redis之前,您仍然可以使用MessagePack,它应该可以工作。您的链接很有趣,LUA似乎确实是限制bandwith的最佳方式,因为函数在Redis上本地运行,而Redis命令之间没有网络交互。MessagePack看起来很有趣,我们目前使用的系统在Redis中存储java序列化对象,看到统计数据/基准测试,我对MessagePack非常感兴趣。您提到的示例将传入的JSON转换为MessagePack来存储它。我也对MessagePack感兴趣,但首先从客户机以MessagePack格式传输它是否更有意义?