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
相关产品推荐
相关产品推荐

