gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:45:33 26 4
gpt4 key购买 nike

我有一个维护“请求”状态的网络服务。可能的状态是“Activity ”和“非 Activity ”。我将请求信息存储在 Cassandra DB 中。我有两张表 - 一张用于 Activity 请求,另一张用于非 Activity 请求。它们都有相同的架构。

我的架构如下:

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

我需要实现一个 API,将请求从“Activity ”状态转移到“非 Activity ”状态。我计划通过从“Activity ”表中删除该条目,然后将删除的条目添加到“非 Activity ”表中来实现此目的。

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

编辑

您可能会问为什么我将“Activity ”和“非 Activity ”请求维护为单独的表。我可以将它们合并到一个表中并有一个 IsActive 列。我维护单独表格的理由如下:

我希望对 Activity 表的查询能够非常快。如果我想查询同时包含 Activity 请求和非 Activity 请求的表中的所有 Activity 请求,则效果不佳。 partitionKey 是 userId,我希望 InActive 表对于给定的 UserId 有几个 1000 个 requestId。但是,Active 的每个 UserId 只能有 10 个或更多 requestId。

最佳答案

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

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

这些请求是否始终基于时间?如果是的话,您可以考虑对这些请求进行分类。所以你会有一个像这样的表:

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

时间段可以是每小时或每分钟,只要对您的用例有意义即可。然后,您可以使用不同的选择来处理给定的存储桶。这将使您不会对给定的分区键发出过多的请求。假设时间桶足够大,可以覆盖大多数 Activity 请求,因此您最终不需要查看所有时间桶。

我也不确定您计划保留记录多长时间,如果它们保存很长一段时间或永​​远,此存储桶将确保您不会最终出现过大的分区,这可能最终发生在 InActive 中与其他设置的表。

关于java - 在 Cassandra 中执行删除操作时获取数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com