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 操作。还有其他方法可以达到我的要求吗?请建议。
使用 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 风格会更好。
| 归档时间: |
|
| 查看次数: |
6525 次 |
| 最近记录: |