需要为下面的Cassandra表格设置页码

问题描述 投票:0回答:1
CREATE TABLE feed (
   identifier text,
   post_id int,
   score int,
   reason text,
   timestamp timeuuid,
   PRIMARY KEY ((identifier, post_id), score, id, timestamp)
) WITH CLUSTERING ORDER BY (score DESC, timestamp DESC);

CREATE INDEX IF NOT EXISTS index_identifier ON feed ( identifier );

我想运行2种类型的查询 where identifier = 'user_5' and post_id = 11;where identifier = 'user_5';

我想在每个查询中按10个结果分页。但是,很少有查询的结果数是可变的。所以最好是有一个类似于 *column* > last_record 我可以使用的。

请帮助我。先谢谢你。

P.S:Cassandra版本 - 3.11.6

cassandra pagination nosql cassandra-3.0
1个回答
1
投票

首先,也是最重要的一点--你对Cassandra的态度就像传统的数据库一样,运行在单个节点上。你的数据模型并不支持有效的数据检索以满足你的查询,二级索引也没有什么帮助,因为它仍然需要到达所有的节点来获取数据,因为数据会根据分区键的值分布在不同的节点之间 ((identifier, post_id) 在您的情况下)--它可能在小集群中对小数据有效,但当您扩大规模时,会失败得很惨。

在Cassandra中,所有的数据建模都是从查询开始的,所以如果你在查询时通过 identifier那么它应该是一个分区密钥(虽然你可能会得到一些大分区的问题,如果一些用户会产生大量的消息)。 在分区内部,你可以使用二级索引,这应该不是问题。另外,在分区里面,组织分页更容易。 Cassandra 原生支持前向分页,所以你只需要保持 分页状态. 在Java驱动4.6.0中, 增加了特殊的助手类,以支持结果的分页。虽然它可能不是很有效,因为无论如何它都需要从Cassandra中读取数据,以跳转到给定的页面,但至少它有一些帮助。这里是文档中的例子。

String query = "SELECT ...";
// organize by 20 rows per page
OffsetPager pager = new OffsetPager(20);

// Get page 2: start from a fresh result set, throw away rows 1-20, then return rows 21-40
ResultSet rs = session.execute(query);
OffsetPager.Page<Row> page2 = pager.getPage(rs, 2);

// Get page 5: start from a fresh result set, throw away rows 1-80, then return rows 81-100
rs = session.execute(query);
OffsetPager.Page<Row> page5 = pager.getPage(rs, 5);
© www.soinside.com 2019 - 2024. All rights reserved.