我希望在从缓存中读取项目后删除(无效)。
因此,项目应该存在于缓存中,直到第一次阅读。
我尝试添加expireAfterAccess(0, TimeUnit.NANOSECONDS)
,但未填充缓存。
有没有办法以这种方式使用番石榴缓存,还是我需要在阅读后手动使项目无效?
答案 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);