分页点火缓存的正确方法是什么?

时间:2018-11-04 08:37:20

标签: java pagination ignite

我使用apache ignite缓存作为数据存储。想知道是否有一种方法可以从客户端分页大数据集合。我不需要或不想将数百万条记录从服务器传输到我的Web /移动客户端。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

我在您的代码中看到一个"query":{ "must":[ { "bool":{ "must_not":[ { "match":{ "user.status_id":152 } } ] } }, { "function_score":{ "functions":[ { "filter":{ "term":{ "user.status_id":150 } }, "weight":10 } ] } }, { "query_string":{ "query":"sales", "type":"phrase", "fields":[ "user.job_title^12", "user.company_name^5", "user.name^6" ] } }, { "function_score":{ "functions":[ { "filter":{ "nested":{ "path":"keywords.active", "query":{ "bool":{ "must":[ { "term":{ "keywords.active.is_active":true } }, { "match_phrase":{ "keywords.active.word":"sales" } } ] } } } }, "weight":9000 } ] } } ] } 。它使所有数据都传输到调用方。这正是您想要避免的。

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

指定限制和偏移量的

SQL SELECT查询也是一个选项。但是,如果您有多个节点,则在执行过程中,LIMIT + OFFSET记录将从每个节点加载到reducer。您应该考虑到这一点。