com.google.common.cache.CacheLoader原因分析

问题描述

        今天在使用guava cache的时候,报了如下错误:

 

 

com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 50816009.
        at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2346)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2316)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3932)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3936)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4806)

 

    之前使用的时候一直都挺正常的,没有出现过此类异常,调用代码如下:

 

 

 

/** 本地缓存 */
    private LoadingCache<Long, ServiceInfo> queryByCategoryIdCache = CacheBuilder.newBuilder().refreshAfterWrite(CacheConstants.SERVICE_INFO_CACHE_REFRESH_TIME, TimeUnit.SECONDS)
            .maximumSize(CacheConstants.MAX_SIZE_PER_CACHE).build(new CacheLoader<Long, ServiceInfo>() {
                public ServiceInfo load(Long categoryId) {
                    return getServiceInfoByCategoryId(categoryId);
                }
            });

 

 @Override
    public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache) {
        if (withCache) {
            try {
                return queryByCategoryIdCache.get(categoryId);
            } catch (Throwable t) {
                logger.error("query serviceInfo exception", t);
                return null;
            }
        } else {
            return getServiceInfoByCategoryId(categoryId);
        }
    }

 

 

原因分析

        后来又仔细看了下报错信息,大概意思是结果的返回值为null,而guava缓存中又不会存放value为null的数据,导致抛出异常。如果业务流程中,允许存在结果为null的话,只需要捕获到该异常后,返回null就行,可以忽略产生的一次信息。示意代码如下:

 

@Override
    public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache) {
        if (withCache) {
            try {
                return queryByCategoryIdCache.get(categoryId);
            } catch (Throwable t) {
                return null;
            }
        } else {
            return getServiceInfoByCategoryId(categoryId);
        }
    }

 

 

Google Guava实战指南:从基础API到短链接服务完整示例 Java开发中常见的判空、拼接、集合转换等重复代码,不仅耗时而且易错,这时引入Google Guava这类Java工具库可以显著提升编码效率。作为Google开源的核心库,Guava在集合、字符串处理、本地缓存、事件总线、哈希等领域提供了高效API。从不可变集合到Multimap、BiMap等新集合类型,从Joiner与Splitter到Preconditions参数校验,再到Guava Cache解决手写缓存的线程安全和过期策略痛点,以及EventBus实现模块间解耦,配合Hashing生成哈希指纹,都是 阅读详情

相关推荐

Google Guava 实战:集合增强、本地缓存与并发工具全解析

在Java工程开发中,集合转换、字符串解析、本地缓存等基础操作往往消耗大量时间,而手写工具类容易引入边界问题。Google Guava作为开源的核心Java类库,通过提供不可变集合、Multimap、BiMap、Table等高效数据结构,以及CacheBuilder、RateLimiter、EventBus等实用工具,大幅简化代码逻辑并提升系统稳定性。它弥补了JDK在集合语义和缓存管理上的不足,适用于后端服务、微服务公共模块及接口转译等场景。掌握Guava的依赖引入、集合增强、缓存回收策略与并发限流机制,能

weixin_30338497的博客 378

LoadingCache 报com.google.common.cache.CacheLoader$InvalidCacheLoadException

com.google.common.cache.CacheLoader$InvalidCacheLoadException

m0_60005397的博客 1959

Java com.google.common.cache.CacheLoader原因分析

问题描述 今天在使用guava cache的时候,报了如下错误: com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 50816009. at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2346) at com.goog

专注基础架构领域 3848

CacheLoader returned null for key分析和解决

背景 今天在使用的时候使用GuavaCache的refreshAfterWrite的功能时,发现在少数场景下会报错CacheLoader returned null for key。但是如果把refreshAfterWrite去掉时,又不会报错。具体错误内容是这样的。 com.google.common.cache.CacheLoader$InvalidCacheLoadException: Ca...

codingtu的博客 2万+

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1339

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2478

直接存在内存里面的缓存com.google.common.cache.Cache使用

@Component @Data public class CacheManager { // 创建二级缓存对象 private LoadingCache<String, ? extends Cache> cache = CacheBuilder.newBuilder() // 对同一个缓存key最大支持并发数(当前是个文件夹就是可同时16个线程请求该文件夹) .concurrencyLevel(16) //

weixin_47733858的博客 9320

100kHz手持LCR表设计:高频阻抗测量与校准实战解析

阻抗测量是电子元件测试的基础,LCR表通过施加正弦激励并分析电压电流的幅值与相位,即可获取电容、电感、电阻的等效参数。在开关电源、无线充电等高频应用场景中,元件在100kHz下的ESR和阻抗特性尤为关键,传统10kHz手持仪表难以满足需求。本文从自动平衡桥原理出发,探讨如何将台式电桥的核心能力浓缩至手持设备,重点剖析高频寄生参数抑制、模拟链路设计、数字相敏检波算法及开路短路校准方法。通过实测数据验证,在100kHz频率下基本精度可达0.5%以内,为维修现场、产线抽检及硬件调试提供了可携带的精密测量方案。全文

weixin_33910191的博客 397

com.google.common.cache 是 Google Guava 库中提供的一个强大的缓存工具包

使用 Guava 的缓存工具包可以帮助你解决许多常见的缓存问题,同时提供了高度可配置的缓存机制来优化应用程序的性能。当使用缓存时,还需要考虑缓存穿透(请求不存在的数据导致缓存失效)和雪崩(大量缓存同时失效导致大量请求直接打到数据库)等问题,并采取相应的策略来预防这些问题。缓存项的自动加载:当使用 LoadingCache 时,如果请求的项不存在,缓存将自动使用配置的 CacheLoader 来加载项。基于容量的清除:你可以设置缓存的最大容量,并定义当达到该容量时应如何选择和删除缓存项的策略。

[Blog][Domain] programb.blog.youkuaiyun.com 4119

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 429

RISC-V详细介绍

文章目录写在前面什么是RISC-VRISC-V诞生的背景ISA霸权摩尔定律的穷途末路穷困潦倒的学者不断增长的指令数量RISC-V架构设计思想如何设计一个好的ISARISC-V之RV32I四个典型特点RISC-V之乘除法指令指令格式用乘法代替常数除法RISC-V之RV64RISC-V的特权架构机器模式监管者模式 写在前面 本文主要基于RISC-V中文手册,其中包括但不限于一些网络的资料。本文版权属于skywf,转载或借用请联系作者。 什么是RISC-V RISC-V(发音为“risk-five”)是一个基于

skywf的博客 3万+

com.google.common.cache.CacheLoader 本地緩存的使用方法

http://blog.sina.com.cn/s/blog_a2ec891e0101a20v.html     package com.taobao.ju.my.common.biz.manager.impl;   import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException...

u022731937的博客 1116

一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写

分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写;

menghuyouyou的博客 5781

Package com.google.common.cache

类是用来构建缓存实例的建造者(Builder),它支持各种特性,如最近最少使用(LRU)的驱逐策略、当达到最大大小时自动驱逐、基于时间的条目过期、自动包装键为弱引用、自动包装值为弱引用或软引用等。是 Google Guava 库中的一个包,提供了强大的缓存功能。这个包中的类可以帮助你创建和管理缓存,以优化性能和资源使用。

[Blog][Domain] programb.blog.youkuaiyun.com 1086

Android以太网开关流程分析

Android以太网开关流程分析 一、引言   在Android 以太网服务启动流程中我们启动了EthernetService(ES),NetworkManagementService(NMS)等服务,其中ES作为Binder的服务端,向客户端EthernetManger提供了调用接口的引用。因此,应用可以通过EthernetManger来访问以太网的相关接口。本篇文章将从APP调用以太网的使能和关闭的接口流程作为切入点来分析,以太网框架中,上层app是如何将指令传递到底层。图1-1所示为以太网使能和关闭

franc521的博客 6112

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1479

org/apache/hbase/thirdparty/com/google/common/cache/CacheLoader

日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 报错: Caused by: java.lang.NoClassDefFoundError: org/apache/hbase/thirdparty/com/google/common/cache/CacheLoader Caused by: java.lang.ClassNotFoundException: org.apache.hbase.t...

あずにゃん梓喵的博客 4669

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

com.google.common.cache.Cache.LoadingCache本地缓存还回null报错

com.google.common.cache.Cache.LoadingCache 如下定义一个缓存变量: protected LoadingCache<String,UserIdVo> studentCache2 //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例 = CacheBuilder.newBuilder() //设置并发级别为8,并发级别是指可以同时写缓存的线程数 .conc

wanyu_123的博客 3688

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

org.apache.hbase.thirdparty.com.google.common.cache.CacheLoader

错误: Hive与HBase整合过程中创建关联表正确,往Hive中导入数据时出现错误: 解决办法 将guava-11.0.2.jar拷贝到${HADOOP_HOME}/bin目录下面

哈 2633

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Google Guava之--cache

一、简介  Google Guava包含了Google的Java项目许多依赖的库,如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。本...

dh3939的博客 149

Guava Cache本地缓存实战:从原理到应用,解决Java高并发场景数据缓存难题

缓存是提升系统性能、降低后端负载的核心技术之一,其基本原理是将计算成本高或获取缓慢的数据暂存于高速存储中,以空间换时间。在Java应用开发中,面对高频访问但计算或获取成本高的数据时,本地缓存因其极致的读取速度(通常O(1)复杂度)和零网络开销,成为优化单JVM进程内数据访问的首选方案。其技术价值在于有效应对高并发查询、避免重复计算,从而显著提升应用响应能力与吞吐量。典型的应用场景包括缓存数据库查询结果、复杂计算指标、外部API调用结果等。针对本地缓存实现中常见的缓存淘汰、过期策略、线程安全及缓存击穿等挑战,

weixin_34232744的博客 353

深入解析Guava Cache:本地缓存核心原理、实战应用与避坑指南

本地缓存是提升应用性能、保障系统稳定性的关键技术,通过在应用进程内部存储热点数据,有效减少对数据库或远程服务的重复访问,降低响应延迟与系统负载。其核心原理基于内存数据结构与缓存淘汰策略(如LRU),在应对高并发查询、缓解后端压力方面具有重要技术价值。典型应用场景包括数据库查询结果缓存、API响应缓存及配置信息存储等。本文聚焦Google Guava Cache这一高性能Java本地缓存库,详细解析其缓存加载机制、过期策略与内存管理,并针对缓存穿透、雪崩等常见问题提供实战解决方案,帮助开发者构建稳健的缓存层。

chuange6363的博客 374

Gradle's dependency cache may be corrupt解决方法

问题描述: 1 2 3 4 5 6 7 Error:Unable to find method 'com.google.common.cache.CacheBuilder.build(Lcom/google/common/cache/CacheLoader;)Lcom/google/common/cache/Loadi...

u013297881的专栏 558

Google Guava 用法指南

Google Guava 的用法

weixin_42614150的博客 249
上一篇: Java实现观察者设计模式
下一篇: Comparator多级排序
nuistcc
博客等级 码龄17年 2粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值