代码之家  ›  专栏  ›  技术社区  ›  firstpostcommenter

在缓存过期后,Guava CacheBuilder不会立即调用removalListener

  •  0
  • firstpostcommenter  · 技术社区  · 6 年前

    缓存配置:

    SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
    GuavaCache cache = new GuavaCache("cacheData", CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.MINUTES).removalListener(expiredCacheListener()).build());
    

    cache.get(key) 如果没有值则调用(因为缓存因 expireAfterAccess() 方法时间限制),然后它在缓存中为同一个密钥放置一个新值,因为旧密钥已过期/已删除。

    在这个写操作之后,我认为removalListener正在调用 expiredCacheListener() 方法,该方法具有更改过期密钥的值的逻辑。。。。//但这实际上是在改变新的价值!!!

    现在我在缓存中有一个值不正确的有效密钥

    1 回复  |  直到 6 年前
        1
  •  2
  •   Grzegorz Rożniecki    6 年前

    这就是番石榴缓存的工作原理,请看 CachesExplained

    什么时候清理?

    CacheBuilder 不执行清理和收回值 那种。相反,它在 写入操作,或在偶尔的读取操作期间,如果写入是 罕见。

    阅读更多了解,番石榴创作者“把选择权交给你”,你可以自由维护cluenup线程自己。

    更高级的 Cache 用例使用 Caffeine Removal wiki页面提到,对于同步删除侦听器,可以使用 CacheWriter .