在expireafteraccess/expireafterwrite之后不会收回缓存

c7rzv4ha  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(594)

我的配置:

  1. @Bean
  2. public CaffeineCacheManager cacheManager() {
  3. return new CaffeineCacheManager();
  4. }
  5. @Bean
  6. public CaffeineCache testCache() {
  7. return new CaffeineCache("test_cache",
  8. Caffeine.newBuilder()
  9. .maximumSize(10000)
  10. .expireAfterAccess(30, TimeUnit.SECONDS)
  11. .expireAfterWrite(30, TimeUnit.SECONDS)
  12. .recordStats()
  13. .build());
  14. }

测试代码:(连续读取缓存3次,每次读取之间暂停45秒)

  1. static int value = 1;
  2. ...
  3. Cache testCache = cacheManager.getCache("test_cache");
  4. System.out.println("read " + testCache.get("myKey", () -> value++));
  5. try {
  6. Thread.sleep(45000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. System.out.println("read " + testCache.get("myKey", () -> value++));
  11. try {
  12. Thread.sleep(45000);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. System.out.println("read " + testCache.get("myKey", () -> value++));

实际结果:

  1. read 1
  2. read 1
  3. read 1

预期结果:缓存在30秒后被逐出:

  1. read 1
  2. read 2
  3. read 3

我错了什么?
如何修复?

ss2ws0br

ss2ws0br1#

我自己也没用过咖啡因,但我读了一些书,下面是我发现的。

怎么了

咖啡因的缓存同步进行维护。因此,除非调用 putcleanUp . 这是来自他们的javadoc:
某些缓存配置将导致定期维护任务的累积,这些任务将在写入操作期间执行,或在没有写入的情况下偶尔执行读取操作。返回的缓存的cache.cleanup()方法也将执行维护,但在高吞吐量缓存中不需要调用它。只有使用maximumsize、maximumweight、expireafterwrite、expireafteraccess、weakkeys、WeakValue或SoftValue构建的缓存才能执行定期维护。

修复

试着打电话 testCache.cleanUp() 在你打电话之前 testCache.get(...)

相关问题