You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ignite瘦客户端扫描查询仅获取键不获取值的实现方法咨询

Ignite瘦客户端仅扫描缓存键、不加载值的实现方案

存在成熟的实现方案,全程不会加载大体积的缓存值,仅返回UUID类型的键,具体实现和优化方案如下:

核心实现方法

方案1:ScanQuery 开关控制(推荐,Ignite 2.11+ 瘦客户端支持)

通过ScanQuery的内置参数直接关闭值返回逻辑,扫描过程仅读取键数据:

  • Java瘦客户端示例代码:
// 初始化瘦客户端
IgniteClient client = IgniteClient.start(clientCfg);
// 获取目标缓存实例
IgniteCache<UUID, Object> cache = client.cache("your_cache_name");
// 构造扫描查询
ScanQuery<UUID, Object> scanQry = new ScanQuery<>();
// 核心配置:关闭值返回,仅加载键
scanQry.setIncludeValues(false);
// 游标迭代遍历,不会一次性加载全量键到内存
try (QueryCursor<Cache.Entry<UUID, Object>> cursor = cache.query(scanQry)) {
    for (Cache.Entry<UUID, Object> entry : cursor) {
        UUID key = entry.getKey();
        // 此处自行实现键的处理逻辑,entry.getValue()固定返回null,无内存占用
    }
}

其他语言瘦客户端对应API均有同名开关:

  • C# 端设置ScanQuery.IncludeValues = false
  • Python 端调用scan方法时传入include_values=False

方案2:SQL字段查询(兼容所有版本瘦客户端)

如果使用的Ignite版本低于2.11,没有IncludeValues开关,可以用SQL字段查询直接查询内置_key字段:

SqlFieldsQuery qry = new SqlFieldsQuery("SELECT _key FROM \"your_cache_name\".YourValueClass");
try (FieldsQueryCursor<List<?>> cursor = cache.query(qry)) {
    for (List<?> row : cursor) {
        UUID key = (UUID) row.get(0);
        // 处理键逻辑
    }
}

超大规模数据集扫描优化建议

  • 调整分页大小:调用scanQry.setPageSize(2000)设置单次网络请求返回的键数量,建议设置在1000~5000区间,根据网络环境调整,避免单次请求压力过大。
  • 分区并行扫描:多节点集群可以按缓存分区遍历,循环调用scanQry.setPartition(partitionId),支持多线程并行扫描不同分区,大幅提升扫描速度,同时降低单节点负载。

注意:禁止直接调用cache.keySet()获取全量键,该方法会把所有键一次性加载到客户端内存,超大规模数据集会直接触发客户端OOM。

内容的提问来源于stack exchange,提问作者Rohan19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:54:02