Spring Boot Cached Scheduled Pageable过滤器

时间:2019-05-05 17:38:16

标签: java spring spring-boot caching

我得到了一些条件的奇怪组合。 我目前正在开发一个Spring Boot REST Api,它返回一些货币数据。 我每5分钟运行一次计划任务,该任务将从数据库中获取所有货币数据,因此用户不会每次都访问数据库。我认为所有数据约为6mb,因此我实现了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();
}

我用@Cacheable注释了DAO函数

@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毫秒,这非常好(在localhost上)。

预先感谢和问候

编辑问题2: 我通过获取完整的缓存来解决它, stream()。parallel()。filter(...)。 也许这不是最好的解决方案,但它足够快,并且本地响应时间为18ms。

0 个答案:

没有答案