首页 > 解决方案 > 什么是分页点燃缓存的正确方法?

问题描述

我使用 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 仅限于迭代器......

谢谢。

标签: javapaginationignite

解决方案


getAll()在你的代码中看到了一个。它使所有数据都传输到调用方。这正是您想要避免的。

Iterator避免了这个问题,因为数据是按需分批加载的。因此,当您运行查询时,您不必将所有内容加载到单个节点的内存中。页面大小可以通过设置ScanQuery#pageSize属性来配置。默认为1024,可以通过调用QueryCursor.iterator()方法获取迭代器。因此,您需要保留一个迭代器,而不是保留偏移量。

指定 LIMIT 和 OFFSET 的SQL SELECT查询也是一个选项。但是如果你有多个节点,那么 LIMIT + OFFSET 记录将在执行期间从每个节点加载到减速器。你应该考虑到它。


推荐阅读