#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() сделал это за меня