Размер не выгружается из кэшей кофеина

#java #caffeine

#java #кофеин

Вопрос:

Прямо сейчас мне просто интересно, почему, возможно, тоже нужна помощь.

Поэтому, когда я добавляю значения в свой список, он будет добавлен, но через 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, а значений нет.

Ответ №1:

По умолчанию записи с истекшим сроком действия удаляются лениво во время планового обслуживания, которое запускается несколькими операциями чтения или записи. Это приводит к раскрытию размера базовой карты, тогда как записи будут скрыты, если будут запрошены и удалены в какой-то более поздний момент. Cache.cleanUp() Может быть вызван для выполнения работ по техническому обслуживанию.

Фоновый поток требуется, если вы хотите, чтобы записи с истекшим сроком действия удалялись быстро, независимо от активности кэша. Это можно настроить, настроив a Scheduler в сборщике. Java 9 включает встроенный поток планирования для всей JVM, а не создает новый, поэтому кэш можно настроить как,

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

Комментарии:

1. Cache.cleanUp() сделал это за меня