我想提供一个签名为-
`public void addObjectToCacheWithExpiry(CaffeineCacheManager caffeineCacheManager, String cacheName, String key, Object value, long duration, TimeUnit timeUnit)`
这样我就可以在特定缓存中放入一个值,并将持续时间作为参数传递。
Ben Caffeine Cache - Specify expiry for an entry提供了一些解释
`. @Override
public void addObjectToCacheWithExpiry(CaffeineCacheManager caffeineCacheManager, String cacheName, String key, Object value, long duration, TimeUnit timeUnit) {
CaffeineCache caffeineCache = (CaffeineCache) caffeineCacheManager.getCache(cacheName);
Cache<Object, Object> nativeCache = caffeineCache.getNativeCache();
Policy.VarExpiration varExpiration = (Policy.VarExpiration) nativeCache.policy().expireVariably().get();
varExpiration.put(key, value, duration, timeUnit);`
}
我没能理解整个过程。它提到我们可以使用cache.policy()来获取Policy.VarExpiration接口,该接口提供了对我需要的方法的访问。为此,我添加了以下代码-
原则上,这就是我想要的。但是,当我获得nativeCache对象时,它不会显示为策略(policy = null)。这阻止了我使用它来放置对象,因为它只返回NPE。我该如何处理这个问题?null policy for empty map
添加CaffeineCache的配置-
` `@Bean
public CaffeineCacheManager caffeineCacheManager(Caffeine caffeine){
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.setCaffeine(caffeine);
return caffeineCacheManager;
}
@Bean
public Caffeine CaffeineCacheConfig() {
return Caffeine.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES)
.initialCapacity(1000)
.maximumSize(1200);
}`
`
1条答案
按热度按时间mwg9r5ms1#
我能让它工作。从文件上看-
/**根据可变过期策略返回执行操作的访问权限。此策略 * 确定一旦每个条目 * 持续时间过去,条目应自动从该高速缓存中删除。
在此基础上,我删除了
expireAfterWrite
属性,并实现了expireAfter
。我能够测试VarExpiration.put
的动态ttl工作正常。我将更新这个答案后,我已经测试了一个默认的5分钟也被应用在一个缺失的ttl的情况下。