Spring Boot下如何按排序格式检索Apache Ignite缓存的Cassandra表?
解决Ignite调用findAll()未按有序组索引排序的问题
首先得明确一个关键点:Ignite的cache.findAll()方法并不会自动使用你定义的有序组索引来排序结果。这个方法本质是遍历缓存中的所有条目,而缓存默认是基于主键的哈希结构存储的,返回顺序由主键的哈希值决定,和你的有序组索引完全无关。你定义的orderedGroups是专门用于优化SQL查询中的排序操作的,并不是给findAll()这类缓存遍历方法用的。
具体解决步骤
1. 改用Ignite SQL查询获取有序结果
要利用你定义的city_subscriber_location有序组索引,你需要通过Ignite的SQL查询接口来执行排序查询,替换掉findAll()方法。以下是贴合你代码场景的具体示例:
Ignite ignite = igniteInstance(); IgniteCache<Integer, Test> cache = ignite.getOrCreateCache("test"); // 编写与有序组顺序完全匹配的SQL查询 SqlQuery<Integer, Test> sortedQuery = new SqlQuery<>(Test.class, "SELECT * FROM Test ORDER BY city ASC, subscribers DESC, location ASC"); // 执行查询并提取排序后的结果 QueryCursor<Cache.Entry<Integer, Test>> cursor = cache.query(sortedQuery); List<Test> sortedData = cursor.getAll() .stream() .map(Cache.Entry::getValue) .collect(Collectors.toList());
这个查询会自动复用你预定义的有序组索引,避免在内存中做全量排序,性能更优。
2. 验证有序组索引是否正确创建
确保你的索引已经被Ignite正确识别,可以通过执行以下SQL查询来检查索引状态:
SELECT * FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = 'Test'
如果查询结果中存在名为city_subscriber_location的索引,且列顺序、排序方向和你在@QuerySqlField中定义的一致,说明索引创建正常。
3. 理解缓存加载与排序的关系
你调用的cache.loadCache(null)只是把Cassandra中的数据批量加载到Ignite缓存中,这个加载过程不会对数据进行排序。缓存中的数据仍然按照Cassandra表的主键key的哈希顺序存储,所以findAll()返回的自然是无序的结果。
额外优化提示
如果你的数据量较大,建议在SQL查询中添加分页逻辑,避免一次性加载全量数据导致内存压力:
sortedQuery.setPageSize(100); // 每页加载100条数据 QueryCursor<Cache.Entry<Integer, Test>> cursor = cache.query(sortedQuery); // 逐页处理结果 for (List<Cache.Entry<Integer, Test>> page : cursor) { // 处理当前页数据逻辑 }
内容的提问来源于stack exchange,提问作者Manikanta Reddy Pasala
相关产品推荐
相关产品推荐

