Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现一个番石榴缓存,使其持久_Java_Google Guava Cache - Fatal编程技术网

Java 实现一个番石榴缓存,使其持久

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

我有一个缓存,它保存一个查找表中的多个值(~50条记录),我想把这些值放在缓存中,我不想让它过期

我的实现如下所示:

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()
,则只有在缓存以外的任何位置都未引用元素时,才会从缓存中删除元素

有关更多信息,请参阅