【发布时间】:2017-07-21 18:24:58
【问题描述】:
卡桑德拉supports upsert for UPDATE。也就是说,如果更新语句中提供的键在表中不存在;它被暗示为插入。如果更新导致更新或插入,有没有办法从更新查询的返回代码中知道。我们更愿意在不从 Cassandra 额外读取的情况下检测到这一点。
我们有一个场景,我们有一个吞吐量非常高的应用程序,其中 99% 的事件导致插入,但非常小的块导致更新。更新后,我们希望执行一些额外的检查并触发一些。
【问题讨论】:
卡桑德拉supports upsert for UPDATE。也就是说,如果更新语句中提供的键在表中不存在;它被暗示为插入。如果更新导致更新或插入,有没有办法从更新查询的返回代码中知道。我们更愿意在不从 Cassandra 额外读取的情况下检测到这一点。
我们有一个场景,我们有一个吞吐量非常高的应用程序,其中 99% 的事件导致插入,但非常小的块导致更新。更新后,我们希望执行一些额外的检查并触发一些。
【问题讨论】:
您可以在更新语句的末尾添加 IF EXITS。
所以更新语句是:
UPDATE person SET name = 'xxxxx' WHERE id = '16843158' IF exists;
对于 table 人和 name,id 是列名。
如果行退出,则返回 True,否则返回 False。使用它,您可以创建一个检查,然后“执行一些额外的检查并触发一些”。如果行没有退出,这也不会插入任何东西。
请检查 true/false 是作为 Row 的列还是作为布尔值返回,因为我只在 cqlsh 中检查过。
为 Java 说话。在 cqlsh 中显示为列输出。
【讨论】:
简短回答:所有 Cassandra 写入都是 upsert,它们不会也无法在写入前检查数据库的状态。
更长的答案:知道是否设置了值需要从 Cassandra 读取,这意味着如果您想知道在 upsert 时是否存在某些内容,则意味着您最终必须在写入之前执行反模式读取。
基本上所有需要这种状态信息的数据模型都需要承受性能损失。最好的办法是找出另一种构建代码的方法。如果您确实需要了解其中的区别,您可以尝试支持 Paxos(如果不存在样式请求),但要知道它们也是有代价的。
【讨论】: