繁体   English   中英

如何配置番石榴缓存以读取后删除项目?

[英]How to configure guava cache to remove item after a read?

我想从缓存中读取一项后将其删除(使之无效)。

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

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

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

这行不通。 “访问”是指“读或写访问”,当它在读取后立即失效时,则在写后也立即终止。

您可以手动删除条目。 您可以使用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)

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

您可能做错了,可能需要详细说明,从而避免了可能的安全问题。

在我的示例中,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;
}

在日志中,“ createdNonce”被打印两次。

get和remove操作是在map界面上的简单remove

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM