当前位置: 代码迷 >> java >> 使用定时过期后,番石榴缓存在x timeunit后不会过期
  详细解决方案

使用定时过期后,番石榴缓存在x timeunit后不会过期

热度:82   发布时间:2023-08-02 10:19:32.0

我有一个问题,我的番石榴缓存没有到期。 我将把我的代码留在下面。 缓存只会在我再次写入缓存时到期。 但是我从javadocs中获得的关于定时到期的内容是它应该在写完后到期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();

这是在Guava维基上解释的,

基本上,只要你不调用缓存的任何方法,就没有任何事情发生,因为没有为缓存创建自己的线程是不可能的,这通常是不希望的,因此不是由Guava缓存自动完成的。

如果您只对缓存进行读取访问,则可能还需要一段时间才能调用您的删除侦听器,因为Guava假定对缓存的读访问应该很快,因此尝试尽可能少地进行读取访问,这意味着它通常不会调用删除侦听器。 只有在一段时间内没有写访问时,缓存才会在读访问时执行清理和调用删除侦听器。

请注意,这仍然意味着过期功能正在运行:不会从任何缓存方法返回过期的条目。 可能只会发生删除侦听器的调用时间比您预期的要晚。

如果要强制及时删除通知,则应定期调用 (例如,从单独的线程)。

如果您在时间过后尽快收到通知很重要,我只需使用并向其提交任务,而不是依赖缓存及其删除通知。

  相关解决方案