使用Caffeine作为本地缓存:
public void initRoleCaches() {
CacheConfig cacheConfig = cacheConfig();
roleCaches = Caffeine.newBuilder()
// 数量上限
.maximumSize(cacheConfig.
getRoleMaxSize())
// 过期机制
.expireAfterAccess(cacheConfig.getExpireAfterAccess(), TimeUnit.MINUTES)
.weakKeys()// 弱引用key
.weakValues() // 弱引用value*/
.recordStats()
// 剔除监听
.removalListener((RemovalListener<Long, Role>) (key, value, cause) ->
log .info("roleCaches removalListener key = {}, value = {}, cause = {}" ,key,value,cause.toString()))
.build();
}
public Role getRole(Long id) {
Role role = getRoleIfPresent(id);
log.debug("getRole 1:"+role);
role = roleCaches.get(id, key -> loadRole(id));
log.debug("getRole 2:"+role);
log.debug("getRole 3:"+getRoleIfPresent(id));
return role;
}
getRole方法调用,日志打印显示每次都没有命中缓存数据,从数据库加载数据
原因:
使用弱应用导致,因为使用了weakKeys选项,caffine使用WeakKeyReference封装了缓存key,导致相同字符序列的不同String对象的key被视为是不同的缓存主键。