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

时间:2015-04-13 20:58:03

标签: java collections guava concurrenthashmap

首先,如果我没有遵守stackoverflow的任何规则和规定,我首先要道歉,因为我是第一次发布问题。

我处于这样一种情况,我需要使用可过期的地图,其中地图中的元素可以在一定时间后自动删除。我很高兴我可以使用google guava的cachebuilder。我需要指定一个默认的时间限制,我可以使用expireAfterWrite(..),但我需要在访问后覆盖它。我可以使用exipreAfterAccess(..)但它仍然在exipreAfterWrite(..)

设置的初始时间后删除它

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

感谢您查看此内容

1 个答案:

答案 0 :(得分:2)

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

请参阅下面的小例子。

  1. 首先说明您当前的情况(expireAfterWrite = 1秒,expireAfterAccess = 2秒) - >每一秒,重新加载值
  2. 然后创建一个只有(expireAfterAccess = 2秒)的缓存并每100ms访问一次 - > Value只加载一次
  3. 然后睡2秒钟 - >值正确重新加载。

  4. 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);
            }
        }
    }