在Cassandra中执行删除操作时获取数据库条目

时间:2016-10-27 19:23:30

标签: java cassandra database-schema

我有一个维持“请求”状态的Web服务。可能的状态是“活动”和“活动”。我将请求信息存储在Cassandra数据库中。我有两个表 - 一个用于Active请求,另一个用于InActive Requests。它们都具有相同的架构。

我的架构如下:

ActiveRequests{
  UserId text,
  RequestId int,
  RequestData text
  PRIMARY KEY(UserId, RequestId)
}

我需要实现一个API,将请求从Active状态移动到InActive状态。我计划通过从Active表中删除条目然后将删除的条目添加到InActive表来执行此操作。

在Cassandra中,似乎DELETE操作实际上并不返回已删除的数据。因此,我必须在请求条目上执行SELECT(以便我可以获取所有请求数据以添加到InActive表),然后执行DELETE操作。有一个更好的方法吗?

修改

您可能会问为什么我将Active和InActive请求维护为单独的表。我可以将它们组合成一个表,并且有一个IsActive列。我维护单独表的原因如下:

我希望我对Active Table的查询非常快。如果我想查询具有Active和InActive请求的表中的所有Active请求,这些请求将不是最佳的。 partitionKey是userId,我希望InActive表对给定的UserId有几个1000个req​​uestId。但是,Active应该每个UserId只有10个或更多的requestId。

1 个答案:

答案 0 :(得分:2)

DELETE返回数据的基本答案是,它确实不是Cassandra可以做的事情。 Cassandra中的删除实际上是对墓碑的写入。 Cassandra一般不会在写入之前进行读取,并且需要将其视为反模式。

另一件需要记住的事情是Cassandra中的删除意味着数据不会离开系统,直到该表的GC Grace设置之后的某个时间。

这些请求是否始终基于?如果他们是你,你可以考虑兑现请求。所以你会有一个像这样的表:

Requests{
  UserId text,
  TimeBucket text,
  RequestId int,
  RequestData text,
  Active boolean,
  PRIMARY KEY((UserId, TimeBucket) RequestId)
}

时间段可能是每小时或每分钟对您的用例有意义。然后,您可以使用不同的选择来处理给定的存储桶。这样可以防止对给定分区键的请求过多。假设timebucket足以覆盖大多数活动请求,因此您最终不需要查看所有桶。

我也不确定如果将记录长时间保存或永久保存记录需要多长时间,这种分组将确保您不会最终得到过大的分区发生在InActive表中的其他设置。