如何确保仅在 cassandra 中不存在数据时才写入

Lax*_*ant 1 cassandra cql3 cassandra-2.0

我的服务器应用程序有两种方法:

boolean isMessageExist(messageId) 执行以下查询:

从消息中选择消息 ID 其中消息 ID = 1;

insertMessage(int messageId,String data) 执行以下查询:

INSERT INTO 消息 (messageId,data) VALUES (1, xyz);

在我的代码中,我在下面执行的操作是为了满足“仅在消息不存在时插入”的要求。

if(!isMessageExist(1)){
insertMessage(1,"xyz")
}
Run Code Online (Sandbox Code Playgroud)

但如果对相同 messageId 的请求几乎同时出现,则上述代码将不起作用。

即在时间 T0 ... Read1(1)、Write1(1) 和 Read2(1)、Write2(1) 同时发生,因为两个请求是同时从客户端发送的。有没有办法在服务器端按顺序发出这些请求。我的意思是 Read2(1) 应该总是得到结果 Write1(1) 吗?

由于性能开销,如果 IF NOT EXISTS,我不想使用 CAS 操作。还有其他方法可以达到我的要求吗?请建议。

Bra*_*ing 5

使用 Cassandra 的轻量级事务 (LWT) IF NOT EXISTS 应该比您当前正在做的事情便宜,并且满足您对唯一性的要求。

INSERT INTO message( messageId, data ) VALUES ( 1, xyz ) IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)

您可以测试和验证性能,但两次往返(读、写)几乎肯定比一次 INSERT ... IF NOT EXISTS 更昂贵。

或者,如果您可以重新设计您的应用程序,使其使用 UPSERTS(其中新值只是覆盖旧数据),那么使用更原生的 Cassandra 风格会更好。