在cassandra中将json存储为文本vs blob的优缺点是什么?

blob对我来说的一个问题是,在java中,ByteBuffer(在cassandra中映射到blob)不是Serializable,因此不适用于EJB。

考虑到json相当大,在cassandra中存储json的更好类型。 是文字还是blob?

在决定blob vs json时,json的大小是否重要?

如果它是像oracle这样的任何其他数据库,那么通常使用blob / clob。 但在Cassandra,每个单元可以容纳2GB,这有关系吗?

请将此问题视为本案例中text和blob之间的选择,而不是排序到是否为json使用单列的建议。

我认为将文字 JSON数据存储为Cassandra中的BLOB没有任何好处。 最多,您的存储成本是相同的,一般而言,使用BLOB类型的API不像处理字符串/文本那样方便。

例如,如果您正在使用他们的Java API,那么为了使用参数化的PreparedStatement将数据存储为BLOB您首先需要将其全部加载到ByteBuffer ,例如将JSON数据打包到InputStream

除非您正在处理非常大的 JSON片段,否则会强制您流式传输数据,这对于访问BLOB类型来说是一项额外的工作。 你会从中获得什么? 基本上没什么。

但是,我认为有一些优点可以问’ 我应该将JSON存储为文本,还是将其压缩并将压缩数据存储为BLOB ”。

答案就取决于你如何配置Cassandra和你的桌子。 特别是,只要您使用Cassandra 1.1或更高版本,您的表默认启用压缩。 这可能就足够了,特别是如果您的JSON数据在每一行中相当一致。

但是,Cassandra的内置压缩是在表范围内应用的,而不是单个行。 因此,您可以通过在存储之前手动压缩JSON数据,将压缩字节写入ByteBuffer ,然后将数据作为BLOB发送到Cassandra来获得更好的压缩率。

因此,它基本上归结为存储空间与编程方便性与CPU使用率之间的权衡。 我会按如下方式决定:

  1. 是否最大限度地减少了您关心的存储量?
    • 如果是,则压缩JSON数据并将压缩的字节存储为BLOB ;
    • 否则,请继续#2。
  2. Cassandra的内置压缩是否适用于您的桌面?
    • 如果否(如果无法启用压缩),则压缩JSON数据并将压缩的字节存储为BLOB ;
    • 否则,请继续#3。
  3. 您要存储的数据在每行中是否相对统一?
    • 可能对于JSON数据,答案是“是”,在这种情况下,您应该将数据存储为文本并让Cassandra处理压缩;
    • 否则进入#4。
  4. 你想要效率还是方便?
    • 效率; 压缩JSON数据并将压缩的字节存储为BLOB
    • 方便; 压缩JSON数据,base64压缩数据,然后将base64编码的数据存储为文本。

由于数据不是二进制数据,因此几乎没有理由使用二进制大对象。 当然你可以做到,但为什么呢? 文字更容易为人类阅读,并没有真正的速度/大小差异(。

即使在其他数据库中,您也可以将JSON存储为文本。 例如,即使MySQL有文本字段可以处理相当多的文本(LONGTEXT = 4Gb)。 是的,甲骨文落后了,但希望他们有时也能获得合理的长文本字段。

但是为什么要将整个Json对象存储为文本? json应该真正规范化并存储为DB中的多个字段。

我肯定会说文本比用于存储JSON的blob更好。 JSON最终是文本,因此这种类型有意义,但是blob可能会有额外的开销,因为一些驱动程序似乎要求在插入之前将它们转换为Hex。 此外,blob在使用cqlsh时显示为base64编码的字符串,因此如果您需要进行测试,则无法轻松检查实际存储的JSON。 我不确定blob是如何存储在磁盘上的,但我想它与文本的方式非常相似。

话虽如此,存储大型条目可能会导致问题, 不建议这样做 。 这可能会导致分片问题并消耗大量内存。 虽然常见问题解答指的是超过64MB的文件,但从经验来看,平均每个文件几兆字节会在您开始存储大量文件时导致性能问题。 如果可能的话,如果您希望JSON的大小为兆字节并且在Cassandra中存储对该存储的引用,那么最好使用对象存储。

在即将发布的2.2版本中,Cassandra还为JSON提供原生支持。 http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support