我正在尝试使用guava缓存库创建缓存。我的主要要求之一是我想在CacheLoader.load(..)函数之后设置缓存过期,而不是我在网络上遇到的大部分示例,如下面的那样。
LoadingCache<String, MyClass> myCache =
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).expireAfterWrite(10, TimeUnit.Minutes).build(cacheLoader);
原因是CacheLoader.load(...)函数从数据库中检索的对象包含到期数据。所以我想使用这些信息而不是一些&#34;随机&#34;静态值。
我想要这样的东西。
LoadingCache<String, MyClass> myCache =
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).build(cacheLoader);
...
CacheLoader meCacheLoder = new CacheLoader<String MyClass>(){
@Override
public MyClass load(String key) throws Exception {
// Retrieve the MyClass object from database using 'key'
MyClass myObj = getMyObjectFromDb(key);
int expiry = myObj.getExpiry();
// Now somehow set this 'expiry' value with the cache
????
return myObj;
}
};
OR 为此目的,还有比Guava缓存更好的选择吗?
答案 0 :(得分:1)
路易斯已经指出,番石榴没有这样的特征。
例如,您可以使用EHCache或cache2k。对于cache2k,我可以为您提供快速指示,因为这是我们经常使用的核心功能:
您可以在值对象上实现接口ValueWithExpiryTime
,即:
interface ValueWithExpiryTime {
long getCacheExpiryTime();
}
或者,您可以注册EntryExpiryCalculator
来提取时间值。缓存的构建如下:
Cache<Key, Value> cache =
CacheBuilder.newCache(Key.class, Value.class)
.expiryCalculator(new EntryExpiryCalculator<Key, Value>() {
@Override
public long calculateExpiryTime(
final Key key, final Value value,
final long loadTime, final CacheEntry<Key, Value> oldEntry) {
return value.getExpiry();
}
}
)
.build();
时间是自纪元以来以毫秒为单位的标准长型。默认情况下,到期时间不会在指定时间发生,而是在零或几毫秒之后,具体取决于您的机器负载。这是最有效的模式。如果这是一个问题,请添加sharpExpiry(true)
。
免责声明:我是cache2k的作者......