java - 什么是分页点燃缓存的正确方法?
问题描述
我使用 apache ignite 缓存作为数据存储。想知道是否有一种方法可以对来自客户端的大型数据集合进行分页。我不需要或不希望将数百万条记录从服务器传输到我的网络/移动客户端。
private final ClientCache<UUID, Account> accounts;
public List<Account> getAll(int offset, int limit)
{
return accounts.query(new ScanQuery<UUID, Account>()
.setLocal(false))
.getAll()
.stream()
.skip(offset)
.limit(limit)
.map(entity -> entity.getValue())
.collect(Collectors.toList());
}
这是一种有效的方法吗?
我看过使用游标,但 API 仅限于迭代器......
谢谢。
解决方案
我getAll()
在你的代码中看到了一个。它使所有数据都传输到调用方。这正是您想要避免的。
Iterator
避免了这个问题,因为数据是按需分批加载的。因此,当您运行查询时,您不必将所有内容加载到单个节点的内存中。页面大小可以通过设置ScanQuery#pageSize属性来配置。默认为1024,可以通过调用QueryCursor.iterator()
方法获取迭代器。因此,您需要保留一个迭代器,而不是保留偏移量。
指定 LIMIT 和 OFFSET 的SQL SELECT查询也是一个选项。但是如果你有多个节点,那么 LIMIT + OFFSET 记录将在执行期间从每个节点加载到减速器。你应该考虑到它。
推荐阅读
- sql-server - 为什么在代码中使用 EF6 connectionString 时出现“System.Data.MetadataException:'无法加载指定的元数据资源。'”错误?
- javafx - 为什么我的 javaFX 代码在 cmd 上运行良好,但在 Visual Studio Code 中抛出错误?
- powershell - 使用 cmd 中的参数调用 PowerShell 命令
- rxjs - 调用其他可观察对象的条件可观察对象?
- git - 有没有办法存储当前的 git 索引,`git add -u`,然后将索引恢复到存储状态?
- c - 是否有可能知道从文件中读取的长文本在 C 中会有多少个字符?
- javascript - 在对象属性上使用事件侦听器是否合适/好主意?
- function - 检查 2 个文件位置中的文件的功能不起作用
- javascript - 粒子 JS 的问题
- python - boto3 s3 api 在调用 GetBucketPolicyStatus 操作时失败并显示“(NoSuchBucketPolicy)”