Cassandra:如何知道操作是插入还是更新

时间:2016-04-12 17:06:41

标签: cassandra insert-update

为了最大限度地减少查询次数,我在我的应用程序中仅使用UPDATE方法:

UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ?

如果具有相应主键d1,d2,d3的行不存在,则会自动创建它,这就是我想要的。

但我还想知道,如果插入或更新了行。我已在cassandra documentation中读到有关IF EXIST和'已应用'结果。但是这个:

UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ? IF EXISTS
如果行不存在,

不会执行操作。

有没有办法如何在没有(SELECT和(INSERT或UPDATE))的情况下进行UPSERT并跟踪行的插入或更新?

2 个答案:

答案 0 :(得分:2)

你的问题令人困惑,标题说知道操作。 详细地说,您需要可以用于插入或更新的统一查询。

在cassandra中更新和插入是一样的。

每次(所有列)只需触发插入查询全行,如果存在,则将根据主键更新。

如果它不存在,它将被插入。

答案 1 :(得分:1)

您的问题的答案是否定的,您无法确定写入是执行了行的新插入还是对现有行执行了更新。正如您所注意到的,您可以通过执行read-before-write来自己完成此操作,但之后您已经在每次写入时都引入了性能命中。

按照设计,Cassandra执行Upserts。这种性能优化允许Cassandra数据库引擎在不检查(读取)数据的情况下写入数据。

If EXISTS是一种轻量级交易LWT。它们通常用于乐观并发控制,并且由于隐含的先读后写而增加了延迟(最多四倍)。