我正在使用 Guava 来缓存热数据。当缓存中不存在数据时,我必须从数据库中获取它:
public final static LoadingCache<ObjectId, User> UID2UCache = CacheBuilder.newBuilder()
//.maximumSize(2000)
.weakKeys()
.weakValues()
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(
new CacheLoader<ObjectId, User>() {
@Override
public User load(ObjectId k) throws Exception {
User u = DataLoader.datastore.find(User.class).field("_id").equal(k).get();
return u;
}
});
我的问题是当数据库中不存在数据时,我希望它返回null
并且不进行任何缓存。但是 Guava 将null
密钥保存在缓存中,并在我得到它时抛出异常:
com.google.common.cache.CacheLoader$InvalidCacheLoadException:CacheLoader 为密钥 shisoft 返回了 null。
我们如何避免缓存null
值?