大小未从咖啡因缓存中卸载

Size is not unloading from Caffeine caches

现在我只是想知道为什么,可能也需要帮助。

因此,当我将值添加到我的列表时,它会被添加,但 5 分钟后它会被删除,这是有效的 但是如果我做 list.size() 它仍然说 1 但里面没有值


public class Test extends Runnable {

   private ExpiringSet<User> users; //User is just my object class 

   public Test() {
       users  = new ExpiringSet<User>(5, TimeUnit.MINUTES); //Sets the users

       users.add(new User("John"));
   }

   @Override
   public void run() {
       // This will always say 1 even after i wait 1hour ive seen it has increased after a while then it said 2 
       //and there is no values in the users
       System.out.println("Size: " + users.size()); 

       //But this is empty after 5min        
       for(Iterator<User> iter = users.iterator(); iter.hasNext(); ) {
           User user = (User)iter.next();
           System.out.println("User " + user.getName());
       }
   }

}

public class ExpiringSet<E> extends ForwardingSet<E> {
   private final Set<E> setView;

   public ExpiringSet(long duration, TimeUnit unit) {
       Cache<E, Boolean> cache = CaffeineFactory.newBuilder().expireAfterAccess(duration, unit).build();
       this.setView = Collections.newSetFromMap(cache.asMap());
   }

   @Override
   protected Set<E> delegate() {
       return this.setView;
   }
}

基本上,如果用户内部没有值,我只希望 users.size() 为 0。 当它说 1 并且没有值时,它看起来很奇怪。

默认情况下,过期的条目在例行维护期间被延迟删除,这是由几次读取或写入触发的。这会导致底层地图的大小被暴露,而如果在稍后的某个时间点被查询和驱逐,条目将被隐藏。 Cache.cleanUp()可以调用运行进行维护工作。

如果您希望无论缓存如何都立即删除过期条目,则需要后台线程 activity。这可以通过在构建器上配置 Scheduler 来配置。 Java 9+ 包含一个内置的 JVM 范围内的调度线程,而不是启动一个新线程,因此缓存可以配置为,

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
    .scheduler(Scheduler.systemScheduler())
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(key -> createExpensiveGraph(key));