等价于cassandra中select的batch语句

uemypmqf  于 2021-06-13  发布在  Cassandra
关注(0)|答案(2)|浏览(295)

我正在处理一个奇怪的问题,我不知道我的设计是否正确。我有一张这样的table

CREATE TABLE Content (
  group_id bigint,
  content_id bigint,
  metadata blob,
  group_payload blob static,
  PRIMARY KEY (group_id, content_id)

你可以看到 group_payload 是静态的。如果我需要获取给定 group_id 我以前是这样做的

SELECT * FROM Content WHERE group_id = X;

然而,这让 group_payload 这会导致性能和内存问题,因为这是一个相当大的blob。
因此,我将查询分为2部分,如下所示

SELECT group_payload WHERE group_id = X limit 1;
SELECT metadata WHERE group_id = X;

这是一个奇迹般的性能改善,但它遭受了偶尔的比赛条件,即我得到了 group_payload 但是当我拿到 metadata 这个 group_payload 已经过时了。
有没有一种方法可以“批处理”这2个select查询。我是否应该捕获不一致性并重试(数据允许检测到这一点),或者有更好的方法来实现这一点?
谢谢

sczxawaw

sczxawaw1#

简短的回答-不-没有批处理 select 与cassandra一样,cassandra中的数据读取没有快照隔离。
在您的情况下,我可能会考虑数据处理的逻辑—也许可以先获取所有元数据,然后获取组负载?

xmd2e60i

xmd2e60i2#

你将无法批量读取。如果读取元数据非常耗时,那么在读取元数据之后再读取有效负载。如果您想检查在获取元数据后有效负载是否更新,cassandra允许读写特定列的时间,但这看起来不是一个好的解决方案。
有趣的是,您的用例需要来自组的单个有效负载和来自组的所有元数据。另外,您正在读取单个分区的元数据,这应该需要几毫秒。如果您的负载更新如此频繁,那么您可以考虑过时但一致的(基于元数据和负载的写入时间)结果。

相关问题