【问题标题】:cassandra lookup by list of primary keys in javacassandra通过java中的主键列表查找
【发布时间】:2020-10-19 22:10:52
【问题描述】:

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

以下是 id 为主键的示例数据

mytable
id          column1
1           423
2           542
3           678
4           45534
5           435634
6           2435
7           678
8           4564
9           546

我的大部分查询都是按 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));
}

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

select coulmn1 from mytable where id in (1, 3, 5, 7, 9);

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

【问题讨论】:

    标签: java cassandra cql cassandra-3.0 datastax-java-driver


    【解决方案1】:

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

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

    结果:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-11
      • 2015-06-29
      • 1970-01-01
      • 2020-08-09
      • 2013-11-28
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多