java - google guava cachebuilder 在 exipreAfterAccess 和 expireActerWrite 之间使用更长的时间

标签 java collections guava concurrenthashmap

首先,如果我第一次发布问题,没有遵守 stackoverflow 的任何规则和规定,我深表歉意。

我遇到的情况是,我需要使用可过期的 map ,其中 map 中的元素可以在一定时间后自动删除。我很高兴我可以使用谷歌 Guava 的缓存构建器。我需要指定一个默认时间限制,我可以使用 expireAfterWrite(..) 来完成,但我需要在访问后覆盖它。我可以使用 exipreAfterAccess(..) 但在 exipreAfterWrite(..) 设置的初始时间后它仍然会删除它

如何实现此功能,以便删除条件检查 exipreAfterAccess 和 expireActerWrite 之间的较长时间

感谢您对此的调查

最佳答案

我只是建议不要设置expireAfterWrite值。这将完全达到您想要的效果。

请参阅下面的小示例。

  1. 它首先说明了您当前的情况(expireAfterWrite=1 秒,expireAfterAccess=2 秒)--> 每秒都会重新加载值
  2. 然后,它仅创建一个缓存(expireAfterAccess=2 秒)并每 100 毫秒访问一次——>值仅加载一次
  3. 然后 hibernate 2 秒 --> 值已正确重新加载。

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Stopwatch;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

public class TestCache {

    private static final String KEY = "Key";

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CacheLoader<String, String> loader = new CacheLoader<String, String>() {
            @Override
            public String load(String key) throws Exception {
                System.out.println("Loading key");
                return key;
            }
        };
        LoadingCache<String, String> cache1 = CacheBuilder.newBuilder().expireAfterAccess(2L, TimeUnit.SECONDS)
                .expireAfterWrite(1L, TimeUnit.SECONDS).build(loader);
        cache1.get(KEY); // First write
        testCache(cache1);
        LoadingCache<String, String> cache2 = CacheBuilder.newBuilder().expireAfterAccess(2L, TimeUnit.SECONDS).build(loader);
        testCache(cache2);
        System.out.println("Final test on cache 2");
        Thread.sleep(2001);
        System.out.println(cache2.get(KEY));

    }

    private static void testCache(LoadingCache<String, String> cache1) throws ExecutionException, InterruptedException {
        Stopwatch sw = Stopwatch.createStarted();
        while (sw.elapsed(TimeUnit.SECONDS) < 5) {
            System.out.println(sw.elapsed(TimeUnit.MILLISECONDS) + " " + cache1.get(KEY));
            Thread.sleep(100);
        }
    }
}

关于java - google guava cachebuilder 在 exipreAfterAccess 和 expireActerWrite 之间使用更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614975/

相关文章:

java - 在 Java 中使用什么集合代替二维数组?

java - 如何连接到通过spring实例化的hsqldb

java - 使用手机登录 Firebase 返回空指针

java 。对 Java 对象集合中的精确值进行分组和求和

java - IndexOutOfBounds 与索引 14,大小 16。如何?

java - 从 Multimaps.synchronizedSortedSetMultimap 转换多重映射

java - doPost 请求如何工作?

java - Tomcat 中 RMI 的安全异常

java - 当有连续的​​大写字母时,如何在 Java 中将驼峰式大小写转换为小连字符

scala - 构建自动化 - sbt : Compile/Test against multiple dependencies