2016-02-17 33 views
0

嗨我是新的谷歌番石榴集合,所以我需要集合,这将过期一段时间.So我已经写了下面的代码,但它不会删除数据过期time.Can任何人都可以告诉我什么是代码问题。番石榴CacheBuilder不按预期工作

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.But后线程包含在地图对象之前删除上面的代码之后。

回答

4

expireAfterAccess状态的Javadoc:

过期的条目可以在Cache.size()进行计数,但绝不是可见的读取或写入操作。过期的条目将作为javadoc类中描述的日常维护的一部分进行清理。

这意味着即使条目以.size()计数,它们在任何其他操作中都将不可见。

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

  • 的条目使用get访问:
    地图看到该条目是过时的,直接删除它。
  • 偶尔会发生缓存访问:
    有时访问.get()方法会触发内部清理,javadoc没有为此定义任何周期。
  • 手动拨打Cache.cleanUp()
    这会直接触发清除程序并删除所有过期的条目。

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

如果您想在删除条目时发出通知,可以使用RemovalListener。您可以使用.removalListener(...)在cachebuilder上设置此侦听器。

+0

嗨感谢您的回复。我想知道如何从缓存映射中读取值并写入缓存映射。这与我们在标准java映射中执行的操作一样。 – Sajithv

+0

当我在睡眠之前添加cache.getIfPresent(“123”)时,它将返回空值。“123”是我添加的对象的关键。 – Sajithv

+0

对不起,哥们,这是我的错。谢谢你的帮助。 – Sajithv