有没有办法实现条件更新,特别是在记录不存在的情况下?

问题描述 投票:0回答:1

我正在使用 Cassandra,需要处理特定的用例:

  1. 使用来自 Kafka 主题的消息。
  2. 将新记录插入 Cassandra 或根据相同 ID 更新现有记录。目标是将数据附加到由 Cassandra 表中的 ID 标识的对象。

当表中尚不存在 ID 时,就会出现我遇到的问题。如果多个 Kafka 消费者同时收到相同的事件,两个消费者都会尝试通过 ID(不存在)获取记录,然后尝试更新它,从而导致竞争条件。

有没有办法在 Cassandra 中实现条件更新,特别是在记录尚不存在的情况下?我不知道如何解决这个问题。

提前致谢。

cassandra conditional-statements
1个回答
0
投票

简单的答案是 Cassandra 提供了一种带有轻量级事务 (LWT) 的条件语句机制。您可以将

IF EXISTS
IF NOT EXISTS
等条件添加到 CQL 语句中,这样它们仅在条件为 true 时才会执行。

一个典型的用例是仅在用户尚未使用时才为其分配新用户名。例如:

INSERT INTO users_by_username (username, firstname, lastname)
  VALUES ('alice123', 'Alice', 'Wonderland')
  IF NOT EXISTS

在上面的示例中,用户名

alice123
仅当表中尚不存在时才会添加。

LWT 有其用途,但应仅在必要时使用,因为它们价格昂贵。 LWT 需要先读后写——Cassandra 必须先执行读取来评估条件,然后才能执行写入。

另一方面,请尽可能使用简单的

UPDATE
,因为无论记录是否存在,Cassandra 都会执行“更新插入”(不执行先读后写),因此速度非常快。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.