如何配置guava缓存以在读取后删除项目?

时间:2017-12-04 19:40:47

标签: java caching guava google-guava-cache evict

我希望在从缓存中读取项目后删除(无效)。

因此,项目应该存在于缓存中,直到第一次阅读。

我尝试添加expireAfterAccess(0, TimeUnit.NANOSECONDS),但未填充缓存。

有没有办法以这种方式使用番石榴缓存,还是我需要在阅读后手动使项目无效?

3 个答案:

答案 0 :(得分:4)

这不会奏效。 "访问"意味着"读或写访问"当它在读取后立即过期时,它也会在写入后立即过期。

您可以手动删除该条目。您可以使用asMap()视图在单次访问中执行此操作:

String getAndClear(String key) {
    String[] result = {null};    
    cache.asMap().compute(key, (k, v) ->
        result[0] = v;
        return null;
    });
    return result[0];
}

您可以切换到Caffeine,这是一种更高级的Guava缓存,并提供非常灵活的expireAfter(Expiry)

但是,我不认为,你想要的是缓存的工作。由于不应该重复使用随机数,我无法想象存储它们的任何理由。通常,您会立即生成并使用它们。

你可能做错了,你可能想详细说明,以避免可能出现的安全问题。

答案 1 :(得分:0)

在我的示例中,nonce被创建两次:

LoadingCache<String, String> cache = CacheBuilder.newBuilder().expireAfterAccess(0, TimeUnit.NANOSECONDS)
    .build(new CacheLoader<String, String>() {
        @Override
        public String load(String key) throws Exception {
            return createNonce();
        }
    });

@Test
public void test_cache_eviction() throws Exception {
    String nonce1 = cache.getUnchecked("key");
    String nonce2 = cache.getUnchecked("key");
}

public String createNonce() {
    String createdNonce = "createdNonce";
    System.out.println(createdNonce);
    return createdNonce;
}

在日志&#34; createdNonce&#34;打印两次。

答案 2 :(得分:0)

在地图界面上,get和remove操作是一个简单的remove

 Object cachedValue = cache.asMap().remove(key);