cassandra通过java中的主键列表查找

nun*_*nam 2 java cql cassandra datastax-java-driver cassandra-3.0

我正在实现一项功能,需要通过主键列表查找 Cassandra。

下面是一个示例数据,其中 id 是主键

mytable
id          column1
1           423
2           542
3           678
4           45534
5           435634
6           2435
7           678
8           4564
9           546
Run Code Online (Sandbox Code Playgroud)

我的大多数查询都是通过 id 进行查找,但对于某些特殊情况,我想获取 id 列表的数据。我目前正在做的方式如下:


public Object fetchFromCassandraForId(int id);

int ids[] = {1, 3, 5, 7, 9};
List<Object> results;
for(int id: ids) {
  results.add(fetchFromCassandraForId(id));
}
Run Code Online (Sandbox Code Playgroud)

这会导致向 cassandra 发出多个网络调用,是否可以以某种方式进行批处理,因此我想知道 cassandra 是否支持通过 ids 列表进行快速查找

select coulmn1 from mytable where id in (1, 3, 5, 7, 9);
Run Code Online (Sandbox Code Playgroud)

?任何帮助或指示将不胜感激?

Ale*_*Ott 5

如果id是完整主键,那么 Cassandra 支持这一点,尽管从性能角度来看不建议这样做:

  • 请求发送到协调节点
  • 协调器节点为每个 找到一个副本id,并向它们发送单独的请求
  • 等待每个节点的结果,将它们收集到结果集并发回

结果:

  • 所有子查询都需要等待最慢的副本
  • 你有一个从协调器到副本的额外网络希望
  • 您给协调器节点施加了更大的压力,因为它需要将结果保存在内存中

如果您对应用程序中的每个值执行大量并行异步请求id,那么您:

  • 避免额外的跃点 - 如果您使用带有令牌感知负载平衡的准备好的语句,则查询将直接发送到副本
  • 当你得到结果时你可能会开始处理它们,而不是等待一切

因此,发送并行异步请求可能比发送一个请求更快IN......