java - Google LoadingCache 无法存储加载的对象
问题描述
我使用 Map 容器作为 LoadingCache 中的值:
@Service
public class SlideCacheSpace {
@Value("${value}")
private int expire;
private LoadingCache<Integer, ConcurrentHashMap<Point, Boolean>> loadingCache = CacheBuilder.newBuilder()
.maximumSize(10000)
.expireAfterWrite(expire, TimeUnit.SECONDS)
.build(
new CacheLoader<Integer, ConcurrentHashMap<Point, Boolean>>() {
public ConcurrentHashMap<Point, Boolean> load(Integer key) {
return new ConcurrentHashMap<>(5000);
}
});
public boolean contains(int slug, Point point) {
ConcurrentHashMap<Point, Boolean> points = loadingCache.getIfPresent(slug);
if (points == null) {
return false;
}
return points.contains(point);
}
public void put(int slug, Point point) throws ExecutionException {
ConcurrentHashMap<Point, Boolean> points = loadingCache.get(slug);
points.put(point, true);
}
public void delete(int slug) {
loadingCache.invalidate(slug);
}
}
问题是我的slideCacheSpace.put(key, val)
方法对 LoadingCache 没有任何影响。调用它后,LoadingCache 不加载任何东西并且仍然是空的(在调试期间检查大小)。无论调用多少次 put 方法,它都保持为空。然而,CacheLoader 中的 load 方法确实会被调用,并且每次返回一个新的 Map 容器时都会被调用。LoadingCache 似乎只是忽略了它加载的值。该contains
方法永远不会返回 true。
我想知道它怎么会发生。
解决方案
contains 方法永远不会返回 true 是因为 Point 类没有正确实现 hashCode/equals 方法。或者您可以尝试使用 String 而不是 Point,然后 contains 将返回 true。
推荐阅读
- php - 如何将数组添加到模型中的另一个数组中?
- java - Java 从 Python 服务器接收消息 - 套接字
- handler - Mybatis - 通过存储过程从 Oracle 中提取用户定义的类型
- java - 如何使用 @InheritInverseConfiguration 和 unmappedTargetPolicy = ReportingPolicy.ERROR 忽略未映射的目标属性
- r - R中有没有办法在MySQL的数据框中散列密码?
- python - 命令引发异常:TypeError: send() got an unexpected keyword for embed
- c# - 如何将数据行转换为通用模型类?
- nestjs - 如何在模块之间使用公共服务?
- javascript - 在 NestJs 和 ReactJS 中使用 websocket
- json - Azure Api 服务上的 JSON 反序列化失败