Caffeine缓存asMap()方法调试无结果,IntelliJ显示‘Collecting data’求助
Caffeine缓存asMap()无法获取值的排查与解决
先验证缓存写入是否成功
别只盯着asMap的调试视图,先用cache.getIfPresent(key)直接检查值是否真的存入缓存。如果这个方法也拿不到值,说明问题出在写入环节:要么是key的equals()/hashCode()实现有问题,要么缓存配置了自动过期、大小限制导致刚写入就被淘汰,或是用了弱/软引用导致对象被GC回收。正确使用asMap()获取缓存内容
Caffeine的asMap()返回的是缓存的实时视图,并非静态快照。IDEA调试时显示“Collecting data”,是因为这个视图是并发安全实现,调试器遍历触发了内部锁阻塞。你可以把视图转成普通HashMap生成副本,这样就能正常查看内容:Map<K, V> cacheSnapshot = new HashMap<>(cache.asMap());也可以直接通过视图的
keySet()、size()方法验证缓存内容,不用依赖调试器的可视化展示。排查缓存配置问题
检查你的缓存构建代码:- 是否设置了
expireAfterWrite/expireAfterAccess等过期策略,导致写入后很快过期? maximumSize/maximumWeight是不是设得太小,触发了淘汰机制?- 是否使用了
weakKeys()/weakValues()/softValues(),导致对象被GC回收?
- 是否设置了
示例代码参考
// 构建缓存 Cache<String, String> cache = Caffeine.newBuilder() .maximumSize(100) .build(); // 写入缓存 cache.put("testKey", "testValue"); // 验证写入成功 System.out.println("直接获取:" + cache.getIfPresent("testKey")); // 转成Map副本获取 Map<String, String> cacheMap = new HashMap<>(cache.asMap()); System.out.println("从Map副本获取:" + cacheMap.get("testKey"));
内容的提问来源于stack exchange,提问作者user12420288
相关产品推荐
相关产品推荐

