gpt4 book ai didi

java - 为什么我在使用 Spring Cache 的服务中有缓存未命中

转载 作者:行者123 更新时间:2023-11-30 08:05:47 25 4
gpt4 key购买 nike

我的缓存配置如下:

@Configuration
@EnableCaching
public class CacheConfig {

@Bean(name = "caffeineCachingProvider")
public CachingProvider caffeineCachingProvider() {
return Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider");
}

@Bean(name = "caffeineCacheManager")
public JCacheCacheManager getSpringCacheManager() {
CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
caffeineConfiguration.setCopierFactory(Copier::identity);
cacheManager.createCache("informerCache", caffeineConfiguration);
return new JCacheCacheManager(cacheManager);
}
}

我还有 @Service 以下列方式使用它:

@Service
public class InformerService {

@CacheResult(cacheName = "informerCache")
public List<Product> getProducts(@CacheKey String category, @CacheKey String countrySign, @CacheKey long townId) throws Exception {
Thread.sleep(5000);
// do some work
}
}

所以我有下一个行为。

  1. 当我第一次调用服务方法时需要 5 秒然后按预期做一些工作。
  2. 第二次使用相同的参数调用方法 -> 缓存起作用 -> 立即返回结果
  3. 第三次使用相同的参数再次调用导致 Thread.sleep

一切从头再来。

如何解决?那是关于代理的问题吗?我错过了什么?

最佳答案

如评论中所述,这是 JCache 适配器中的错误。谢谢你让我知道这个问题。我发布了版本2.1.0其中包括此修复程序。该版本还包括您在另一个 post 中识别的 CaffeineConfiguration 的更友好的初始设置。 .

虽然核心库经过了大量测试,但 JCache 适配器过于依赖 JSR 的 TCK(测试兼容性工具包)。不幸的是,该测试套件不是很有效,所以我添加了测试以帮助避免将来出现此类错误。

此问题仅发生在 JCache 中,因为 Caffeine 的核心库不支持其过期版本。 Caffeine 更喜欢使用 O(1) 设计,通过使用固定持续时间来急切清理过期条目。 JCache 使用每个条目延迟过期,规范作者假设容量约束用于最终丢弃过期条目。我添加了一个 warning有关此功能的文档,因为它可能容易出错。虽然其他 JCache 实现都没有超出此范围,但一项悬而未决的任务是确定一种机制来帮助缓解此 JCache 设计缺陷。

再次感谢您报告此问题。一如既往,如果您有任何其他问题或反馈要分享,请随时与我们联系。

关于java - 为什么我在使用 Spring Cache 的服务中有缓存未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34814622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com