Я выбираю все записи из узлов Кассандры, основываясь на диапазоне токенов моего ключа раздела.
Ниже приведен код:
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 для всех узлов.
Тогда я использую этот диапазон токенов, чтобы запросить кассандру. object[0]
содержит начальный токен vnode и object[1]
конечный токен.
, который генерирует запрос ниже:
SELECT * FROM my_key_space.tablename WHERE token(id)><start token number> AND token(id)<= <end token number>;
В приведенном выше столбце id
указан ключ раздела.
В Кассандре не рекомендуется выполнять диапазонные запросы. Так будет ли этот запрос выполняться?
Из того, что я знаю, этот запрос будет вызывать только отдельный раздел / vnode и не будет вызывать несколько разделов, и, следовательно, не должно быть проблем с производительностью? Это правильно?
Cassandra версия: 3.x