实施 Guava 缓存以永久保存
implement a Guava cache to last for ever
我有一个缓存,其中包含来自查找的多个值(约 50 条记录)table,我想将这些值放入缓存中,我不希望它过期。
我的实现是这样的:
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) {
}
}
}
}
我该怎么做才能让它永恒?
如果您调用 expireAfterAccess
.
,缓存条目只会在给定时间后过期
解决方法:不要调用 expireAfterAccess
!
如果您使用 CacheBuilder.maximumSize
构建缓存,则当接近最大大小时,元素将从缓存中删除。如果您使用 CacheBuilder.expireAfterAccess
构建缓存,则元素将在一段时间后删除。
如果您不想要这些,您应该在没有时间或大小限制的情况下构建您的缓存。如果你使用例如CacheBuilder.weakKeys()
相反,只有在缓存之外的任何地方都没有引用元素时,才会从缓存中删除元素。
有关详细信息,请参阅 Guava Cache Eviction。
我有一个缓存,其中包含来自查找的多个值(约 50 条记录)table,我想将这些值放入缓存中,我不希望它过期。
我的实现是这样的:
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) {
}
}
}
}
我该怎么做才能让它永恒?
如果您调用 expireAfterAccess
.
解决方法:不要调用 expireAfterAccess
!
如果您使用 CacheBuilder.maximumSize
构建缓存,则当接近最大大小时,元素将从缓存中删除。如果您使用 CacheBuilder.expireAfterAccess
构建缓存,则元素将在一段时间后删除。
如果您不想要这些,您应该在没有时间或大小限制的情况下构建您的缓存。如果你使用例如CacheBuilder.weakKeys()
相反,只有在缓存之外的任何地方都没有引用元素时,才会从缓存中删除元素。
有关详细信息,请参阅 Guava Cache Eviction。