я получил действительно странную комбинацию некоторых условий.В настоящее время я разрабатываю Spring Boot REST Api, который возвращает некоторые данные о валюте.Я запускаю запланированное задание каждые 5 минут, которое получает все данные о валюте из базы данных, поэтому пользователь не обращается к базе данных каждый раз.Я думаю, что все данные о 6 МБ, поэтому я реализовал Pageable и Cache.
Запланированное задание:
@CachePut(value = "getCurrenciesAll")
@Scheduled(fixedRate = 60000)
public List<Currency> updateGetCurrenciesAllCache() {
Cache cache = cacheManager.getCache("getCurrenciesAll");
if (cache != null) cache.clear();
return currencyService.getCurrenciesAll();
}
Я аннотировал функцию DAO с помощью @ Cacheable
@Cacheable("getCurrenciesAll")
@Override
public List<Currency> getCurrenciesAll() {
List<Currency> currencies = currencyRepository.findAll();
return currencies;
}
Сервисная функция вызывает полный кешированный список валют (из DAO), создает подсписок со смещением и размером страницы, а затем возвращает страницу
public Page<Currency> getCurrenciesAll(Pageable pageable, String filter) {
List<Currency> currencies = iCurrencyDAO.getCurrenciesAll();
int start = toIntExact(pageable.getOffset());
int end = toIntExact((start + pageable.getPageSize()) > currencies.size() ? currencies.size() : (start + pageable.getPageSize()));
Page<Currency> currenciesPage= new PageImpl<>(currencies.subList(start, end), pageable, currencies.size());
return currenciesPage;
}
Проблема 1: с cache.clear () и@CachePut есть промежуток времени, когда кеш пуст, и все вызовы попадут в базу данных вместо кеша.Если я сначала получу строки из базы данных и очисту кеш, если все строки были получены, функция никогда не будет вызвана, потому что она получит записи в кеше
@CachePut(value = "getCurrenciesAll")
@Scheduled(fixedRate = 60000)
public List<Currency> updateGetCurrenciesAllCache() {
List<Currency> currencies = currencyService.getCurrenciesAll();
Cache cache = cacheManager.getCache("getCurrenciesAll");
if (cache != null) cache.clear();
return currencies;
}
Проблема 2: Как я могу отфильтроватькеш со страничкой?Он отлично работает с pageable, но теперь я хочу «запросить» кеш по названию валюты, например «Eu».Как я могу это сделать?
Я бьюсь головой об стену: D Я пробовал это несколько дней, но теперь я действительно застрял, может быть, кто-то может помочь?
Чтобы получить все данные отБаза данных, объединить ее с другими данными и поместить ее в кеш занимает около 25 секунд.Время отклика конечной точки, доступной для просмотра страниц, составляет около 20 мс, что действительно хорошо (на локальном хосте).
Заранее спасибо и с наилучшими пожеланиями
РЕДАКТИРОВАТЬ проблему 2: IРешил это, получив полный кеш и выполнив поток () .rallel (). filter (...).Возможно, это не лучшее решение, но оно достаточно быстрое, и ответ занимает локально 18 мс.