Что такое правильный способ разбиения на страницы в кеше? - PullRequest
0 голосов
/ 04 ноября 2018

Я использую apache ignite cache в качестве хранилища данных. Хотелось бы узнать, есть ли способ разбить большой объем данных на клиенте. Я не нуждаюсь или не хочу, чтобы миллионы записей передавались с сервера на мой веб / мобильный клиент.

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 голосов
/ 05 ноября 2018

Я вижу getAll() в вашем коде. Это заставляет все данные быть переданными стороне вызывающего абонента. Это именно то, чего вы хотели избежать.

Iterator позволяет избежать этой проблемы, поскольку данные загружаются в пакеты по требованию. Таким образом, вам не нужно загружать все в память одного узла, когда вы запускаете запрос. Размер страницы можно настроить, установив свойство ScanQuery # pageSize . По умолчанию он равен 1024. Итератор можно получить, вызвав метод QueryCursor.iterator(). Поэтому вместо сохранения смещения вам нужно сохранить итератор.

SQL SELECT запрос с указанием LIMIT и OFFSET также является опцией. Но в случае, если у вас более одного узла, записи LIMIT + OFFSET будут загружены с каждого узла в редуктор во время выполнения. Вы должны принять это во внимание.

...