Guava LoadingCache的get和getIfPresent

本地高性能缓存Caffeine 阅读详情
AI摘要

本文对比分析了Guava中LoadingCache的get与getIfPresent方法的区别。get会在缓存缺失时触发加载,而getIfPresent仅返回现有值。通过具体示例展示了两种方法的行为差异。

        最近用到了Guava的 LoadingCache 作为本地缓存,发现这个类的两个方法 get 和 getIfPresent 于是写一篇博客记录下两者的不同。

        先说结论:我们在使用LoadingCache类的适合,builder中会传入一个CacheLoader,这个load方法是用来从别的地方取值保存在内存中的。

        使用get时,如果内存中没有值,会自动调用load方法,如果load方法返回的是null,那么get会抛出异常。

        使用getIfPresent时,如果内存中没有值,不会调用load方法,而是直接返回null。

        以下是用到的测试代码: 

        首先,定义了一个Repository类,这个类有个成员变量,就是我们的主角LoadingCache。这是一个很常见的LocalCache用法。主要讲下build中传入的CacheLoader。这边模拟了下从Redis中读取数据的过程。当这个load方法被调用时,去Redis中获取key对应的value。

        Redis中获取的时候,如果userId大于0,则返回用户+id,否则返回null。

public class LocalCacheTest {
    private Repository repository = new Repository();

    @Test
    public void test() {
        Long id = 0L;
        try {
            get(id);
        } catch (Exception e) {
            System.out.println(e.getClass().getSimpleName());
        }

    }

    public void get(Long id) throws ExecutionException {
        String cacheValue = repository.getFromCache(id);
        if (StringUtils.isEmpty(cacheValue)) {
            System.out.println("value get failed");
        } else {
            System.out.println(
                    String.format("cache value: {%d} - {%s}",id, cacheValue));
        }
    }
}
public class Repository {
    private LoadingCache<Long, String> localCache = CacheBuilder.newBuilder()
            .maximumSize(CacheConstants.MAXIMUM_SIZE)
            .expireAfterAccess(CacheConstants.EXPIRE_TIME, TimeUnit.SECONDS)
            .removalListener(new RemovalListener<Long, String>() {
                @Override
                public void onRemoval(RemovalNotification<Long, String> rn) {
                    System.out.println(
                            String.format("[Repository] cache removed: {%d} - {%s}", rn.getKey(), rn.getValue()));
                }
            })
            .build(new CacheLoader<Long, String>() {
                @Override
                public String load(Long key)  {
                    System.out.println(String.format("[Repository][localCache] get from redis, key = {%d}", key));
                    return getFromRedisMock(key);
                }
            });

    public String getFromCache(Long id) throws ExecutionException {
        System.out.println(String.format("[Repository][getFromCache] get from cache, key = {%d}", id));
        // 使用get
        return localCache.get(id);
        // 使用getIfPresent
        // return localCache.getIfPresent(id);
    }

    public String getFromRedisMock(Long id) {
        if (id > 0) {
            return "用户" + id;
        } else {
            return null;
        }
    }
}

LoadingCache#get

        get在获取本地缓存时,如果值不存在,会主动调用上面提到的load方法,如果load成功得到值,那么会将该值保存在本地缓存中。如果load返回了null,则会抛出异常。

        测试代码如下

        可以看下实验结果,当我们第一次get时,内存里没有对应的值,自动调用load方法去Redis中取值。

        如果把userId改成0,那么Redis会返回null,此时get方法会抛出InvalidCacheLoadException异常。

 LoadingCache#getIfPresent

         接下来测试getIfPresent。把Repository类的getFromCache方法中的get改成getIfPresent后,得到结果如下图。可以发现,getIfPresent在内存中没有对应值的时候,不会去调用load方法,而是直接返回null。

guava cache(LoadingCache)使用和源码分析 guava简介 guava cache是一个本地缓存。有以下优点: 很好的封装了get、put操作,能够集成数据源。 一般我们在业务中操作缓存,都会操作缓存和数据源两部分。如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中。 guava cache封装了这么多步骤,只需要调用一次get/put方法即可。 线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素。 Guav 阅读详情

相关推荐

深入解析Guava并发工具:ListenableFuture、LoadingCache与RateLimiter实战

在Java并发编程中,线程安全与高性能是核心挑战。通过理解并发原理,开发者可以构建更健壮的应用。Guava库提供了一系列高级并发工具,如ListenableFuture实现了基于观察者模式的异步回调,解决了原生Future的阻塞问题;LoadingCache则封装了线程安全的缓存机制,支持自动加载与多种淘汰策略,有效防止缓存击穿。这些工具的技术价值在于将复杂的并发控制抽象为简洁易用的API,提升了开发效率与代码可维护性。在实际应用场景中,它们广泛应用于高并发服务、缓存系统与流量控制等关键领域,是Java开发

331

谷歌guava cache的getIfPresent和getUnchecked区别

LoadingCache: (1)、get(K):使用这个方法要么返回已经缓存的值,要么使用CacheLoader向缓存原子地加载新值。由于CacheLoader可能抛出异常,LoadingCache.get(K)也声明为抛出ExecutionException异常。 如果你定义的CacheLoader没有声明任何检查型异常,则可以通过 getUnchecked(K) 查找缓存;但必须注意,一旦CacheLoader声明了检查型异常,就不可以调用getUnchecked(K)...

当我谈编程时我谈些什么 1万+

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

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

weixin_30338497的博客 378

实战-商品中心-l2cache中caffeine.getIfPresent()仅仅获取缓存,但触发了数据加载,导致被设置为NullValue的问题分析

实战-l2cache中caffeine.getIfPresent()仅仅获取缓存,但触发了数据加载,导致被设置为NullValue的问题分析

白云 4702

LoadingCache学习

2021-07-23日 晚9点 本文主要意思是:学习LoadingCache本地缓存特性和源码。 文中会引用大量的官网观点. 一定要看get源码,注意:回收/删除的动作,可能并不是自动删除,因为涉及到工作线程和用户线程竞争锁。 LoadingCache学习案例适用性官方说明功能主要的类和接口使用常用参数segment数据结构加载获取显示插入源码分析 不外乎 get/put/remove 因为它类似于concurrentMapLocalCache构建LocalCache初始化Segment初始化*

无尽_easy的博客 1632

LoadingCache使用

了解LoadingCache的工作原理 需要着重理解,load方法中是调用二级存储的,返回值会被自动加载到LoadingCache .build( new CacheLoader<Integer, String>() { @Override public String load(Integer key) throws Exception

u011624157的专栏 2465

java loadingcache_缓存-Guava LoadingCache

# Cache常见应用问题与Guava LoadingCache解决方案标签(空格分隔): Java-其他库 架构---[TG架构笔记][1]---## 经典缓存写法```javaprivate Map cache = new ConcurenthashMap();Object getFromCache(String Key){Object value = cache.get(key);if(va...

weixin_35724794的博客 781

RK3588 InsightFace人脸识别移植及精度测试全解析

本文详细介绍了如何在RK3588平台上移植InsightFace人脸识别模型并进行精度验证。通过PyTorch转ONNX、ONNX转RKNN量化模型的关键步骤,实现了INT8量化模型的部署。测试数据显示,该模型在LFW数据集上达到99.43%的准确率(接近官方99.52%),推理时间仅14.23ms。ROC曲线和相似度分布图表明模型区分能力优秀,AUC超过0.99,满足实际应用需求。文中还详解了量化原理、环境搭建和测试方法,为边缘设备部署人脸识别提供了完整解决方案。

Hi20240217的博客 3665

Guava入门~Guava caches

Extends V> value):从缓存中获取值;getIfPresent(key):如果存在返回value,否则null;如果不想执行异步任务,可以使用Callables。put(key,value):往缓存中添加值;

小强快跑~~ 323

Unity卡牌游戏UI框架:数据驱动与模块化设计实践

在Unity游戏开发中,UI系统是连接玩家与游戏逻辑的关键桥梁,其核心在于实现数据与表现的高效同步。数据驱动设计通过分离数据模型、逻辑状态与视图表现,利用观察者模式自动响应状态变化,确保了代码的清晰与可维护性。这种架构显著提升了开发效率,尤其在需要复杂状态管理和实时反馈的交互场景中,如卡牌游戏的拖拽、布局与动画系统。基于模块化思想,开发者可以将卡牌视图、布局管理、区域控制等组件像积木一样组合,快速构建出动态的手牌弧形布局、战场区域管理等特色功能。通过集成对象池、图集优化等性能方案,还能有效管理绘制调用与网格

weixin_34262482的博客 453

STM32G474片内运放实战:从独立模式到PGA与ADC采样链路

在嵌入式控制系统中,运放是连接模拟信号与数字处理的关键环节。传统方案依赖外部分立运放搭建放大电路,存在成本高、PCB布局敏感、一致性差等痛点。STM32G474在MCU内部集成多路可编程运放(OPAMP),支持独立模式、跟随器、PGA以及比较器模式,配合内部ADC和DMA可构成完整模拟采集链路。通过片内互联,信号路径大幅缩短,抗干扰性和通道一致性显著提升,尤其适用于电机电流采样、数字电源等场景。本文以STM32G474为例,详解从独立模式到PGA增益配置,再到ADC与DMA联动调试的完整过程,并给出采样时间

weixin_29194255的博客 246

guava笔记3-cache

缓存的使用有多种方式,可以使用开源的缓存框架,如ehcache,JCS,cache4j等。Guava也帮我们实现了一个小巧而实用的缓存框架。如果不使用缓存框架,自己实现缓存,很多人首先想到的就是声明一个static的map对象。Guava的缓存框架其实就是这么做的,所有理解起来非常容易。1.    使用CacheLoader构造LoadingCacheCacheLoader有个抽象方法load...

昭明 228

西电计组实验二 运算器实验

算术逻辑运算实验 一.实验目的   1.了解简单运算器的数据传输通路。   2.验证运算功能发生器的组合功能。   3.掌握算术逻辑运算加、减、与的工作原理。   4.验证实验台运算的8位加、减、与、直通功能。   5.按给定数据,完成几种指定的算术和逻辑运算。 二.实验原理   算术逻辑单元ALU的数据通路如图2-1所示。其中运算器ALU181根据74LS181的功能用VHDL硬件描述语言编辑而成,构成8位字长的ALU。参加运算的两个8位数据分别为A[7…0]和B[7…0],运算模式由S[3…0]的16种

Polaris的博客 1万+

LoadingCache缓存使用(LoadingCache)

首先需要引入先关pom依赖(项目源码参考:https://github.com/licunzhi/dream_on_sakura_rain/tree/master/loadingcache_demo) 选择合适的版本 &lt;!-- https://mvnrepository.com/artifact/com.google.guava/guava --&gt; &lt;dependency&...

dream_on_sakura_rain 4391

OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成

本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。

lambda的博客 726

高效管理Node.js版本与pnpm安装全攻略

本文提供了一套高效管理Node.js版本与pnpm安装的完整攻略。针对开发中常见的版本冲突和磁盘空间问题,详细介绍了如何在Windows和Ubuntu系统上安装并配置pnpm,并重点讲解了如何利用其内置的`pnpm env`命令进行Node.js版本管理,实现一站式环境管理,提升开发效率。

weixin_28840591的博客 313

Guava库学习:学习Guava Cache(二)Guava caches(1)_Cache

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33958366的博客 121

【COMSOL】将一个面上数据导出CSV或txt格式的方法

在COMSOL中参数化扫描后,把一个面上或体里的数据按照CSV或TXT格式导出的方法。

dave496206的博客 2989

Guava Cache使用笔记

[b]1.Guava Cache的get/getIfPresent方法当参数为null时会抛空指针异常[/b] 我刚开始使用时还以为Guava Cache跟HashMap一样,get(null)返回null。 实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。 [b...

代码说-Let code talk 506

ENVI5.3.1使用Landsat 8影像进行辐射定标和大气校正实例操作

ENVI5.3.1使用Landsat 8影像进行辐射定标和大气校正实例操作

PeanutbutterBoh的博客 12万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

weixin_34232744的博客 353

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用Guava中Cache的注意点

guava中Cache过期使用注意点

weixin_42437243的博客 795

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SpringBoot缓存(一)----guava本地缓存

谷歌开源的工具库,其Cache来源于jdk7的ConcurrentHashMap(jdk8的ConcurrentHashMap引入了红黑树)。 少量的数据缓存可以直接使用包装类,List、hashmap等。 如果希望数据存储的空间是可控的,并且改变结果,使用这种方法是推荐的。 首先pom里引入google的guava包。 <dependency> <...

qq_38522268的博客 907

Guava入门~CacheBuilder

1、concurrencyLevel指定更新并发数;2、刷新值触发时间点,请求并且已过期;示例二:最后访问后,多少间隔失效。示例三:间隔多久自动刷新。

小强快跑~~ 686

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

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

chuange6363的博客 374

Guava Cache Deep Dive

Guava Cache 是 Google Guava 提供的本地缓存实现,基于 JDK7 的 ConcurrentHashMap 分段锁设计。它支持自动加载、容量控制、过期策略和基于引用的回收机制,但已停止更新,Google 推荐使用 Caffeine 替代。 核心架构采用三层设计:LoadingCache → LocalCache → Segment[],每个 Segment 包含哈希表、写入队列、访问队列和最近使用队列。 主要功能: CacheLoader 机制实现自动加载,避免缓存穿透 提供 get(

quwenqian的专栏 437
下一篇: Kafka副本同步机制,HW和Leader Epoch
坨坨小公主
博客等级 码龄7年 22粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值