【发布时间】:2019-06-03 21:19:21
【问题描述】:
我正在根据我的分区键的令牌范围从 cassandra 节点中选择所有记录。
下面是代码:
public static synchronized List<Object[]> getTokenRanges(
final Session session) {
if (cluster == null) {
cluster = session.getCluster();
}
Metadata metadata = cluster.getMetadata();
return unwrapTokenRanges(metadata.getTokenRanges());
}
private static List<Object[]> unwrapTokenRanges(Set<TokenRange> wrappedRanges) {
final int tokensSize = 2;
List<Object[]> tokenRanges = new ArrayList<>();
for (TokenRange tokenRange : wrappedRanges) {
List<TokenRange> unwrappedTokenRangeList = tokenRange.unwrap();
for (TokenRange unwrappedTokenRange : unwrappedTokenRangeList) {
Object[] objects = new Object[tokensSize];
objects[0] = unwrappedTokenRange.getStart().getValue();
objects[1] = unwrappedTokenRange.getEnd().getValue();
tokenRanges.add(objects);
}
}
return tokenRanges;
}
getTokenRanges 为我提供了所有节点上的 vnode 的所有令牌范围。
然后我使用这些令牌范围来查询 cassandra。 object[0] 持有 vnode 的开始令牌和 object[1] 结束令牌。
生成以下查询:
SELECT * FROM my_key_space.tablename WHERE token(id)><start token number> AND token(id)<= <end token number>;
在上面的id 列是分区键。
在 Cassandra 中不建议执行范围查询,那么,这个查询会是高效的吗?
据我所知,这个查询只会调用单个分区/vnode,不会调用多个分区,因此不应该有任何性能问题?这是正确的吗?
Cassandra 版本:3.x
【问题讨论】:
标签: cassandra datastax-enterprise cassandra-3.0