大小未从咖啡因缓存中卸载
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));
现在我只是想知道为什么,可能也需要帮助。
因此,当我将值添加到我的列表时,它会被添加,但 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));