0

我有一个缓存,其中包含查找表中的多个值(约 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) {
            }   
        }
    }
}

我能做些什么让它永恒?

4

2 回答 2

1

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

如果您不想要任何这些,您应该在没有时间或大小限制的情况下构建您的缓存。如果您改用 eg CacheBuilder.weakKeys(),则只有在缓存之外没有任何地方引用元素时,才会从缓存中删除元素。

有关更多信息,请参阅Guava 缓存驱逐

于 2018-02-15T12:58:40.660 回答
1

如果您调用,缓存条目仅在给定时间后过期expireAfterAccess

解决方法:不要打电话expireAfterAccess

于 2018-02-15T12:48:35.830 回答