java大小不是从缓存中卸载的

r1zhe5dt  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(359)

现在我只是想知道为什么,prob也需要帮助。
因此,当我向列表中添加值时,它将被添加,但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并且没有值的时候看起来很奇怪。

epfja78i

epfja78i1#

默认情况下,在例行维护期间,过期条目会被延迟删除,这是由几次读取或一次写入触发的。这将导致基础Map的大小被公开,而如果稍后查询并逐出,则条目将被隐藏。这个 Cache.cleanUp() 可以调用运行维护工作。
如果希望无论缓存活动如何都能立即删除过期的条目,则需要后台线程。这可以通过配置 Scheduler 在建筑工人身上。Java9+包含一个内置的jvm范围的调度线程,而不是一个新的线程,所以缓存可以配置为,

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

相关问题