java - cassandra通过java中的主键列表查找
问题描述
我正在实现一个需要通过主键列表查找 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);
? 任何帮助或指示将不胜感激?
解决方案
如果id
是完整的主键,则 Cassandra 支持这一点,尽管从性能角度不建议这样做:
- 请求被发送到协调节点
- 协调器节点为每个 找到一个副本,
id
并向它们发送单独的请求 - 等待来自每个节点的结果,将它们收集到结果集并发回
结果:
- 您所有的子查询都需要等待最慢的副本
- 你有一个从协调者到副本的额外网络希望
- 您给协调器节点施加了更大的压力,因为它需要将结果保存在内存中
如果您对来自应用程序的每个值执行大量并行异步请求id
,那么您:
- 避免额外的跃点 - 如果您使用带有令牌感知负载平衡的准备好的语句,则查询将直接发送到副本
- 您可能会在获得结果时开始处理结果,而不是等待一切
因此发送并行异步请求可能比发送一个请求更快IN
...
推荐阅读
- javascript - 本地存储不更新 React
- php - PHP opencv解析错误:语法错误,意外'{',
- c++ - for循环中使用的运算符的优先级是什么
- apache-spark - 用零 PySpark 替换字符串类型列中的空值
- python - 散点矩阵和线性回归
- python - Python 中的递归函数调用如何在空字典中找到键?
- python - 有没有办法使用矢量化来操作具有 1D 的 3D 数组?
- c++ - 为什么第一个循环具有不同的值?
- javascript - Javascript 将文件中的所有模块作为全局变量导入
- python - 在 x 轴上随时间绘制时出现奇怪的刻度间距