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

时间:2016-07-27 17:51:58

标签: cassandra cassandra-2.0 cql3

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

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

  

从消息中选择messageId,其中messageId = 1;

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

  

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

在我的代码中,我正在执行以下操作,以满足“仅在消息不存在时才插入”的要求。

if(!isMessageExist(1)){
insertMessage(1,"xyz")
}

但是,如果对同一messageId的请求几乎同时发生,则上述代码无效。

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

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

1 个答案:

答案 0 :(得分:0)

使用Cassandra的轻量级交易(LWT)如果不是EXISTS应该比您目前正在做的更便宜,并满足您对唯一性的要求。

INSERT INTO message( messageId, data ) VALUES ( 1, xyz ) IF NOT EXISTS

您可以测试并验证性能,但两次往返(读取,写入)几乎肯定比单个INSERT更昂贵...如果不是EXISTS。

或者,如果您可以重新设计您的应用程序,那么它使用UPSERTS - 新值只会覆盖旧数据,这样会更好,并使用更原生的Cassandra风格。