Cassandra CQL3条件插入/更新



我有一个无序事件列表,我的任务是存储它们的第一次和最后一次出现。

我在卡桑德拉有以下专栏家族:

CREATE TABLE events (
   event_name TEXT,
   first_occurrence BIGINT,
   last_occurrence BIGINT,
   PRIMARY KEY (event_name)
);

因此,如果我有一个名为"some_event"的事件,并且发生次数为123456,那么我想做的事情在MySQL中看起来是这样的:

INSERT INTO events (event_name, first_occurence, last_occurence)
VALUES ('some_event', 123456, 123456)
ON DUPLICATE KEY UPDATE 
     first_occurrence = LEAST(first_occurrence, 12345), 
     last_occurrence = GREATEST(last_occurrence, 123456)

我打算在Cassandra中使用轻量级事务来完成它,比如:

INSERT INTO events(event_name, first_occurrence, last_occurrence) VALUES ('some_event', 12345, 12345) IF NOT EXISTS;
UPDATE events SET first_occurrence = 123456 WHERE event_name='some_event' IF first_occurrence > 123456;
UPDATE events SET last_occurrence = 123456 WHERE event_name='some_event' IF last_occurrence < 123456;

但事实证明,CQL3不允许<和>轻量级事务IF子句中的运算符。

所以我的问题是,进行这种条件更新的模式是什么?

您正在运行哪个版本的cassandra?2.1.1中通过CASSANDRA-6839:增加了对LWT不平等条件的支持

cqlsh:test> UPDATE events SET first_occurrence = 123456 WHERE event_name='some_event' IF first_occurrence > 1;
[applied]
-----------
  True

Cassandra不先读后写,只有两个例外——计数器和"轻量级事务"。因此,您将无法直接在Cassandra中可靠地实现您的场景。即使您读取了值,然后根据这些值进行更新,您也可能覆盖其他人的更改,因为Cassandra中没有锁定和隔离,最终的一致性会使情况变得更糟。

所以,如果你需要实现这样的东西,你需要在Cassandra之外完成。创建一个同步层,为Cassandra写入提供一个中心点,并使该层负责逻辑。只需确保在这一层周围没有写入。

最新更新