插入空值时如何避免cassandra逻辑删除

xriantvc  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(502)

我的问题是,cassandra在插入空值时会创建墓碑。
据我所知,cassandra不支持null,当插入null时,它只删除相应的列。一方面,这非常节省空间,但另一方面,它会造成读性能下降的墓碑。
这是因为cassandra节省了空间,但降低了读取性能。在nosql世界中,空间很便宜,但是性能很重要。我相信这就是以非规范化形式保存表背后的哲学。
我希望cassandra使用与任何其他值相同的插入null的技术—使用时间戳并在压缩过程中保留最新条目—即使条目为null(或者我们可以称之为“unset”)。在cassandra配置中是否有任何调整,或者如何在没有墓碑的情况下使用nulls实现upserts的方法?
我遇到了这个问题,但是它只允许忽略空值
我的用例:我有事件流,每个事件都由causeid标识。我收到许多具有相同causeid的事件,我只想存储相同causeid的最新事件(使用upsert)。事件的属性可以从null更改为特定值,也可以从特定值更改为null。不幸的是,后一种情况会产生墓碑并降低读取性能。
更新
看来我没办法避开墓碑。你能告诉我如何最小化它们的技巧吗(将gc\u grace\u seconds设置为非常低的值)。当一个节点宕机的时间超过gc\u grace\u秒时,有什么风险,该怎么办?

aurhwmvo

aurhwmvo1#

你不能在Cassandra中插入空值-它在那里有特殊的意义,并导致你观察到的墓碑的创建。如果您想将null视为特殊值,为什么不在应用程序端解决这个问题呢 null 状态,只需插入任何不能在表中使用的特殊值,然后在读回数据时,检查该特殊值和输出 null 收件人。。。

dgiusagp

dgiusagp2#

如果你在插入中特别提到null,你就不能避免墓碑。c在插入或写入数据之前不进行查找,这使得写入速度非常快。为此,c只需插入一个逻辑删除标记,以避免以后使用该值(使用最新更新来比较时间戳)。如果要避免使用tombstone(这是推荐的),则必须准备不同的查询组合,以便在将每个查询添加到insert之前检查它们是否为null。如果要检查的字段很少,那么只需添加一些if-else语句就很容易了。但是如果有很多这样的代码,代码会更大,可读性也会降低。很快,就不能插入null,这将影响以后的读取性能。
将空值插入cassandra

相关问题