Java 实现一个番石榴缓存,使其持久
我有一个缓存,它保存一个查找表中的多个值(~50条记录),我想把这些值放在缓存中,我不想让它过期 我的实现如下所示:Java 实现一个番石榴缓存,使其持久,java,google-guava-cache,Java,Google Guava Cache,我有一个缓存,它保存一个查找表中的多个值(~50条记录),我想把这些值放在缓存中,我不想让它过期 我的实现如下所示: static { cache = CacheBuilder.newBuilder().removalListener(new RemovalListener<String, Record>() { }).maximumSize(100) .expireAfterAccess(1, TimeUnit.DAY
static {
cache = CacheBuilder.newBuilder().removalListener(new RemovalListener<String, Record>() {
}).maximumSize(100)
.expireAfterAccess(1, TimeUnit.DAYS) // ??
.build(new CacheLoader<String, Record>() {
@Override
public Record load(String id) throws Exception {
throw new Exception("not cached");
}
});
}
静态{
cache=CacheBuilder.newBuilder().removalListener(new removalListener()){
}).最大尺寸(100)
.expireAfterAccess(1,时间单位.天)/??
.build(新的缓存加载程序(){
@凌驾
公共记录加载(字符串id)引发异常{
抛出新异常(“未缓存”);
}
});
}
在构造函数中,我检查缓存是否为空,然后从数据库加载数据:
cache = CacheUtil.getLoadingDeviceCache();
if(cache == null || cache.size() == 0) {
synchronized(this) {
List<Record> allAuthorizedDevices = DB.getAuthorizedDevices();
for (Record record : allAuthorizedDevices) {
try {
cache.put(record.getValue("id").toString(), record);
} catch (DataSetException e) {
}
}
}
}
cache=CacheUtil.getLoadingDeviceCache();
if(cache==null | | cache.size()==0){
已同步(此){
列出allAuthorizedDevices=DB.getAuthorizedDevices();
用于(记录:allAuthorizedDevices){
试一试{
cache.put(record.getValue(“id”).toString(),record);
}捕获(DataSetException e){
}
}
}
}
如何使其永久化?如果调用
expireAfterAccess
,则缓存项仅在给定时间后过期
解决方案:不要调用
expireAfterAccess
如果调用expireAfterAccess
,则缓存项仅在给定时间后过期
解决方案:不要调用
expireAfterAccess
如果使用CacheBuilder.maximumSize
构建缓存,则当接近最大大小时,将从缓存中删除元素。如果使用CacheBuilder.expireAfterAccess
构建缓存,则元素将在一段时间后被删除
如果你不想要这些,你应该在没有时间或大小限制的情况下构建你的缓存。如果改用例如CacheBuilder.weakKeys()
,则只有在缓存以外的任何位置都未引用元素时,才会从缓存中删除元素
有关详细信息,请参阅。如果使用
CacheBuilder.maximumSize
构建缓存,则当接近最大大小时,将从缓存中删除元素。如果使用CacheBuilder.expireAfterAccess
构建缓存,则元素将在一段时间后被删除
如果你不想要这些,你应该在没有时间或大小限制的情况下构建你的缓存。如果改用例如CacheBuilder.weakKeys()
,则只有在缓存以外的任何位置都未引用元素时,才会从缓存中删除元素
有关更多信息,请参阅