实现一个Guava缓存,永远持续下去

时间:2018-02-15 12:39:17

标签: java google-guava-cache

我有一个缓存,它从查询表中保存多个值(~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 = 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) {
            }   
        }
    }
}

我能做些什么让它永恒?

2 个答案:

答案 0 :(得分:1)

如果您拨打expireAfterAccess,则缓存条目仅在给定时间后过期。

解决方案:不要致电expireAfterAccess

答案 1 :(得分:1)

如果使用CacheBuilder.maximumSize构建缓存,则在接近最大大小时,将从缓存中删除元素。如果使用CacheBuilder.expireAfterAccess构建缓存,则会在一段时间后删除元素。

如果您不想要任何此类内容,则应在没有时间或大小限制的情况下构建缓存。如果您使用例如CacheBuilder.weakKeys()相反,如果除了缓存之外的任何地方都没有引用元素,那么元素只会从缓存中删除。

有关详细信息,请参阅Guava Cache Eviction