Cassandra CQL3 条件 insert/update
Cassandra CQL3 conditional insert/update
我有一个无序事件列表,我的任务是为它们存储第一次和最后一次出现的事件。
我在 Cassandra 中有以下列族:
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 个例外 - counters and "lightweight transactions”。因此,您将无法直接在 Cassandra 中可靠地实现您的场景。即使您读出值然后根据这些值进行更新,您可能会覆盖其他人的更改,因为 Cassandra 中没有锁定和隔离,最终一致性使情况变得更糟。
因此,如果您需要实现类似的功能,则需要在 Cassandra 之外进行。创建一个同步层,为 Cassandra 写入提供中心点,并让该层负责逻辑。只需确保没有写入围绕该层进行。
你是哪个版本的 cassandra 运行?通过 CASSANDRA-6839:
在 2.1.1 中添加了对 LWT 不相等条件的支持
cqlsh:test> UPDATE events SET first_occurrence = 123456 WHERE event_name='some_event' IF first_occurrence > 1;
[applied]
-----------
True
我有一个无序事件列表,我的任务是为它们存储第一次和最后一次出现的事件。
我在 Cassandra 中有以下列族:
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 个例外 - counters and "lightweight transactions”。因此,您将无法直接在 Cassandra 中可靠地实现您的场景。即使您读出值然后根据这些值进行更新,您可能会覆盖其他人的更改,因为 Cassandra 中没有锁定和隔离,最终一致性使情况变得更糟。
因此,如果您需要实现类似的功能,则需要在 Cassandra 之外进行。创建一个同步层,为 Cassandra 写入提供中心点,并让该层负责逻辑。只需确保没有写入围绕该层进行。
你是哪个版本的 cassandra 运行?通过 CASSANDRA-6839:
在 2.1.1 中添加了对 LWT 不相等条件的支持cqlsh:test> UPDATE events SET first_occurrence = 123456 WHERE event_name='some_event' IF first_occurrence > 1;
[applied]
-----------
True