Guava CacheBuilder没有按预期工作

时间:2016-02-17 10:26:26

标签: java dictionary collections guava

嗨,我是谷歌番石榴收藏品的新手,所以我需要收集一段时间才会过期。所以我写了下面的代码,但是在过期时间之后它不会删除数据。任何人都可以告诉我代码的问题。< / p>

Cache<String, Object> cache = CacheBuilder.newBuilder()
                .expireAfterAccess(2, TimeUnit.MILLISECONDS)
                .build();
        Object object = new Object();            
        cache.put(object.getId(), object);
        System.out.println("size :" + cache.size());
        Thread.sleep(50000);
        System.out.println("After Size :" + cache.size());

我需要添加对象来映射,并且在过期时间之后它将从map中删除。但是在线程包含对象的地图之前和之后的上面的代码。

1 个答案:

答案 0 :(得分:5)

expireAfterAccess状态的javadoc:

  

过期的条目可能会计入Cache.size(),但读取或写入操作永远不会显示。过期的条目将作为javadoc类中描述的例行维护的一部分进行清理。

这意味着即使条目使用.size()计算,它们也不会在任何其他操作中显示。

这些无效条目将自动删除。根据javadoc,这发生在以下情况:

  • 使用get访问该条目:
    地图会看到该条目已过期并直接将其删除。
  • 偶尔进行缓存访问:
    有时访问.get()方法会触发内部清理,javadoc没有为此定义任何时间段。
  • 手动调用Cache.cleanUp()
    这会直接触发清理例程,并删除所有过期的条目。

更多信息似乎在Github Wiki of the cache class中解释。

如果您希望在删除条目时发出通知,则可以使用RemovalListener。您可以使用.removalListener(...)在缓存生成器上设置此侦听器。