首页 > 解决方案 > 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。

我想知道它怎么会发生。

标签: javaguava

解决方案


contains 方法永远不会返回 true 是因为 Point 类没有正确实现 hashCode/equals 方法。或者您可以尝试使用 String 而不是 Point,然后 contains 将返回 true。


推荐阅读