我有一个问题,我的番石榴缓存未过期。我将代码留在下面。缓存仅过期一次,我再次写入缓存。但是从我从javadoc那里获得的关于时间到期的信息来看,它应该在写入后到期x timeunit。任何帮助,将不胜感激。
private static final Cache<UUID, RainbowWrapper> RAINBOWS = CacheBuilder.newBuilder()
.removalListener(new RemovalListener<UUID, RainbowWrapper>() {
@Override
public void onRemoval(RemovalNotification<UUID, RainbowWrapper> notification) {
CoreAPI.debug("Removing rainbow: " + notification.getKey().toString());
RainbowWrapper wrapper = notification.getValue();
for (UUID uuid : wrapper.getUuids()) {
CoreAPI.debug("Removing entity: " + uuid);
Bukkit.getWorlds().get(0).getEntitiesByClasses(Item.class, ArmorStand.class).stream()
.filter(entity -> entity.getUniqueId().equals(uuid))
.forEach(org.bukkit.entity.Entity::remove);
}
}
}).expireAfterWrite(FADE_TIME, TimeUnit.SECONDS).build();
最佳答案
这在Guaa Wiki上When does Cleanup happen?下进行了解释
基本上,只要不调用缓存的任何方法,就什么也不会发生,因为如果不为缓存创建自己的线程是不可能的,这通常是不希望的,因此Guava缓存不会自动完成。
如果您仅对缓存具有读取访问权限,则调用删除监听程序可能还需要一段时间,因为Guava认为对缓存的读取访问应该是快速的,因此尝试为读取访问执行尽可能少的工作,这通常意味着它不调用移除监听器。只有在一段时间内没有写访问权限时,缓存才会在读访问权限时进行清理和呼叫删除侦听器。
请注意,这仍然意味着过期功能正在工作:过期的条目不会从任何缓存方法中返回。删除监听器的调用可能比您预期的晚。
如果您想强制及时删除通知,则应定期调用Cache.cleanUp()
(例如,从单独的线程中)。
如果对您而言重要的是在时间流逝后尽快获得通知,那么我将简单地使用ScheduledExecutorService
并向其提交任务,而不是依赖于缓存及其删除通知。
关于java - 使用定时过期时,x时间单位后Guava缓存未过期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31489197/