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

Java 在Cassandra中执行删除操作时获取数据库条目,java,cassandra,database-schema,Java,Cassandra,Database Schema,我有一个维护“请求”状态的web服务。可能的状态为“活动”和“非活动”。我将请求信息存储在Cassandra数据库中。我有两个表-一个用于活动请求,另一个用于非活动请求。它们都有相同的模式 我的模式如下: ActiveRequests{ UserId text, RequestId int, RequestData text PRIMARY KEY(UserId, RequestId) } 我需要实现一个API,将请求从活动状态移动到非活动状态。我计划从活动表中删除条目,然后将

我有一个维护“请求”状态的web服务。可能的状态为“活动”和“非活动”。我将请求信息存储在Cassandra数据库中。我有两个表-一个用于活动请求,另一个用于非活动请求。它们都有相同的模式

我的模式如下:

ActiveRequests{
  UserId text,
  RequestId int,
  RequestData text
  PRIMARY KEY(UserId, RequestId)
}
我需要实现一个API,将请求从活动状态移动到非活动状态。我计划从活动表中删除条目,然后将删除的条目添加到非活动表中

在Cassandra中,似乎
DELETE
操作实际上并不返回已删除的数据。因此,我必须在请求条目上执行
选择
(这样我就可以获得添加到非活动表的所有请求数据),然后执行
删除
操作。有更好的方法吗

编辑

您可能会问我为什么要将活动和非活动请求作为单独的表来维护。我可以将它们组合到一个表中,并有一个
IsActive
列。我维护单独表格的理由如下:

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

我希望对活动表的查询速度非常快。如果我想查询一个表中的所有活动请求,该表既有活动请求,也有非活动请求,这将不是最优的。partitionKey是userId,我希望非活动表对于给定的userId有1000个requestid。但是,Active每个用户ID应该只有10个或更多的RequestID。

删除
返回数据的基本答案是Cassandra确实做不到这一点。《卡桑德拉》中的删除实际上是对墓碑的书写。卡桑德拉通常不会先读后写,这实际上被认为是一种反模式

另一件需要记住的事情是Cassandra中的delete意味着数据直到您为该表设置了GC Grace之后才会离开系统

这些请求是否始终基于时间?如果他们是,你可以考虑拒绝他们的要求。因此,您将有一张类似于:

Requests{
  UserId text,
  TimeBucket text,
  RequestId int,
  RequestData text,
  Active boolean,
  PRIMARY KEY((UserId, TimeBucket) RequestId)
}
时间桶可以是每小时或每分钟,这对于您的用例来说是有意义的。然后,您可以使用不同的选择来处理给定的存储桶。这将防止您对给定的分区密钥有过多的请求。假设timebucket足够大,可以覆盖大多数活动请求,因此最终不需要查看所有的Bucket


我也不确定如果记录被保存很长一段时间或永远保存下去,您打算保存多长时间。这种备份将确保您不会出现过大的分区,而这些分区最终可能会出现在另一个设置的非活动表中。

为什么要设置两个表呢?如果使用单个表,这将成为一个翻转标志的问题,简单地说,我希望我对活动表的查询速度非常快。如果我想查询一个表中的所有活动请求,该表既有活动请求,也有非活动请求,这将不是最优的。partitionKey是userId,我希望非活动表对于给定的userId有1000个requestid。但是,Active每个UserId应该只有10个或更多的requestid。