guava cache与编程实践

Guava Cache 原理分析与最佳实践 本讲主要针对本地 Cache 的老大哥 Guava Cache 进行介绍和分析。 阅读详情

Guava-cache

    guava cache是google开源代码库中的一个辅助功能模块,可以作为JVM嵌入式cache来使用,基于key-value模型。对于Rdedis、Memcached,这种缓存系统,我们称之为“分布式缓存”,它们通过集群扩容,可以将海量数据cache在远端。而guava cache,作为“嵌入式cache”,这些cache的数据寄宿在当前JVM堆中,和JVM进程具有共同生命周期。它具备如下特点:

  • 占用JVM内存,内部数据结构类似于ConcurrentHashMap。
  • 因为JVM堆大小的限制,guava cache只能保存较少的数据量,不能超过JVM Heap。
  • 相对Redis等“分布式缓存”,它本身不需要RPC调用,性能较高。

    如果你的系统中,有一种数据符合“尺寸较小”、“高频的读取操作”、“变更操作较少”,那么使用guava cache这种“嵌入式缓存”,将非常适合,它将会带来巨大的性能提升。

 

    Guava cache读取过程也符合“get-if-absent-compute”语义,即如果本地缓存中有,则返回对应value,如果key不存在,则通过“加载机制”获取新的value。

  • 通过Cache.put相关方法,将key-value加入缓存。
  • 通过Cache.get,从cache中获取key对应的value。
  • 通过Cache.invalidate,将key-value通缓存中移除。

 

CacheBuilder:用来构建Cache,可以在构建时指定一些全局的参数。

CacheBuilder cacheBuilder = CacheBuilder.newBuilder()
                .concurrencyLevel(Runtime.getRuntime().availableProcessors() - 1)
                .initialCapacity(1024);
//maxCacheSize由外部注入,表示cache中保存的key的最大条数
if(maxCacheSize > 0) {
	cacheBuilder.maximumSize(maxCacheSize);
}else if(maxKeysWeight > 0) {
//maxKeysWeight由外部注入,逻辑上用来表示一种“权重”,
//本例中,我们将key所占的字节数,作为weight。
//当cache中所有的“weight”总和达到maxKeyWeight时,将会触发“剔除策略”。
	cacheBuilder.maximumWeight(maxKeysWeight)
			.weigher(new Weigher<String, Object>() {
				@Override
				public int weigh(String key, Object value) {
					//粗略估计,不适用key.getBytes,避免一次不必要的解析与copy
					return key.length();
				}
			});
}

 

    需要注意,在Guava Cache中,“maximumSize”和“maximumWeight”两种控制cache量的参数,是互斥的,即同时只能设置其中一个。

 

    如果cache中不存在Key,那么意味着这个key的数据需要从一个可靠的地方load,我们有2中方式:

1、通过CacheLoader:

LoadingCache cache = cacheBuilder.build(new CacheLoader<String, Object>() {
                    //如果loader中返回null,则使用NULL占位符替代。
                    public Object load(String key) throws Exception {
                        if(valueLoader == null) {
                            return NULL;
                        }
                        Object value = valueLoader.get(key);
                        if(value == null) {
                            value = NULL;
                        }
                        return value;
                    }
                });

 

    其中valueLoader,是一个自定义的加载器,我们假定valueLoader.get方法,是通过redis从远端获取新的数据。CacheLoader的适应场景就是:当Guava Cache中没有key时,将会通过其load方法加载数据,并保存在Cache中。load方法不能返回NULL。

 

2、通过Callable:

    1)中,LoadingCache这个类通过和CacheLoader配合,完成Key的延迟加载。当然如果你不想使用CacheLoader这种统筹的方式,可以使用Callable接口, 那么你可以在需要的地方,使用Callable来自定义load操作。

Cache<String,Object> cache = cacheBuilder.build();
cache.get("user_id_10000", new Callable<Object>() {
	@Override
	public Object call() throws Exception {
		return redisClient.get("user_id_10000");
	}
});

 

    跟CacheLoader一样,callable.call方法返回的数据也会保存在Cache中。

 

Cache中数据“剔除”(Eviction)

    用户对cache的盲目使用,可能导致cache中数据不断增大,一个残酷的现实就是RAM资源非常有限,所以我们需要将那些不常用的数据移除,Guava cache基于LRU策略剔除数据,开发者只需要控制剔除数据的时机即可。

 

1、Size-based

    通过上述例子,我们已经知道可以通过CacheBuilder.maximumSize(long)方法指定cache中允许的key的个数。如果key的个数即将超过阀值(边际),将会根据LRU算法,剔除那些不常用的K-V。

 

    此外,如果你的每个Key-Value有不同的“weights”--比如每个K-V占用不同的内存量,我们可以用“weight”来描述这一指标。通过使用CacheBuilder.maximumWeights(long)和CacheBuilder.weigher(Weigher)来达成这一目的,当cache中put一个key时,都会计算它的weight值,并累加,当达到maximumWeight阀值时,会触发剔除操作。

 

2、Timed Eviction

    CacheBuilder提供了2中基于“时间”的剔除方式:

  • expireAfterAccess(long,TimeUnit):当key在被“read/write”操作之后,空闲多久后被删除。
  • expireAfterWrite(long,TimeUnit):当key被write(put或者reload)操作之后,空闲多久后被删除。

3、Reference-based

    JAVA中,一个对象的引用类型分为“强、弱、软”(还有“虚引用”),Guava Cache中也可以根据Key或者Value的引用类型,并结合GC,来完成cache数据的剔除。

  • CacheBuilder.weakKeys():将key存为WeakReference,如果JVM中,此key没有任何被任何“强引用”、“软引用”对象引用它,那么此K-V将会从cache中移除。
  • CacheBuilder.weakValues():同上。
  • CacheBuilder.softValues():同上。

“显性”移除

  • Cache.invalidate(key)
  • Cache.invalidateAll(keys)
  • Cache.invalidateAll():移除所有的数据

    CacheBuilder不会在数据过期时立即执行cleanup,这种数据剔除操作,通常是延迟的,在边际条件时,某些write或者read操作会触发cleanup。如果想更加及时的清理过期数据,那么需要自己去创建一个thread,然后周期性的执行cache.cleanUp()。Guava Cache并没有这么做,它主要考虑到,这种“cleanup”会和用户的正常操作产生“锁冲突”,对性能会有额外的干扰。如果开发者能够预料这种事情,那么你就可以这么做。

    

 

 

 

深入解析Guava核心模块:Java开发必备工具库的实战应用 在Java开发中,集合操作、缓存管理和并发编程是提升应用性能与稳定性的关键技术。集合框架作为数据结构的核心,其高效使用直接影响内存管理和线程安全;缓存机制通过减少重复计算和数据库访问,显著优化系统响应速度;并发工具则确保多线程环境下的数据一致性与执行效率。Guava作为Google开源的Java核心库,针对这些基础但关键的领域提供了增强解决方案,其不可变集合、LoadingCache和ListenableFuture等特性,为开发者提供了更安全、更高效的编程范式。本文聚焦Guava的集合工具、缓存系统和并发 阅读详情

相关推荐

Guava Cache实现原理及最佳实践

expireAfterWrite 是允许一个线程进去load方法,其他线程阻塞等待。refreshAfterWrite 是允许一个线程进去load方法,其他线程返回旧的值。在上一点基础上做成异步,即回源线程不是请求线程。异步刷新是用线程异步加载数据,期间所有请求返回旧的缓存值。Guava Cache是一个很优秀的本地缓存工具,缓存的作用不多说,一个简单易用,功能强大的工具会使你在开发中事倍功半。

xidianhuihui的专栏 1761

Guava Cache的使用和参数配置

一:适用场景 1.“尺寸较小”、“高频的读取操作”、“变更操作较少”,这样的场景下比较适合Guava这种“嵌入式”缓存; 2.当然对于一些“数据较大”、“需要一定的持久化”保障的,需要考虑redis、memcached等分布式缓存 二:使用 1.创建方式:使用CacheLoader:这样可以直接使用cache.get(key)即可 public static co...

JoshuaXin的博客 6259

Caffeine 与 Guava Cache

Caffeine 与 Guava Cache 一、概要 1.1 背景 在项目开发中,为提升系统性能,减少 IO 开销,本地缓存是必不可少的。最常见的本地缓存是 Guava 和 Caffeine,Caffeine 是基于 Google Guava Cache 设计经验改进的结果,相较于 Guava 在性能和命中率上更具有效率。 1.2 应用场景 愿意消耗一些内存空间来提升速度 预料到某些键会被多次查询 缓存中存放的数据总量不会超出内存容量 二、Guava Cache 2.1 Guava Cache缓存回收 (

weixin_44131265的博客 1791

guava缓存使用不当导致的FullGC

java使用guava cache不当,导致的fullgc研究

码农无双的博客 4236

Springboot集成Guava Cache

一、首先导入依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.6-jre</version> </dependency> 二、guava的配置,那个24指的是24小时

liuxw1的博客 3156

Google Guava核心功能与实战应用详解

Google Guava是Google开源的一款高效、简洁且线程安全的Java工具库,旨在提升开发效率并增强代码可读性与健壮性。其核心模块涵盖集合扩展()、本地缓存(cache)、并发工具(concurrent)、I/O操作(io)等,广泛应用于大型企业级项目中。通过Maven引入Guava仅需添加以下依赖:初识Guava可从不可变集合与空值处理开始。

weixin_42128315的博客 544

Guava缓存及Guava线程池

Guava缓存及Guava线程池

weixin_42594143的博客 2502

Qt自带绘图与GDI+绘图方式比较_gdi+实时绘制qt(2)

2、GDI+是Windows操作系统中的图形设备接口,它提供了一套用于绘制图形的API,包括了图形渲染、图形变换、图形剪切、图形填充等功能,使开发者可以快速地开发出各种类型的图形应用程序。1、Qt是一个跨平台的C++应用程序框架,它提供了一套用于GUI编程的类库,包括了绘图、网络、XML、数据库、多线程等模块,使开发者可以快速地开发出高质量的跨平台应用程序。Qt提供了一套用于绘图的类库,包括了QPainter、QPen、QBrush等类,使开发者可以快速地进行图形绘制。

qq_17136213的博客 917

guava cache编程实践总结

guava cache是google开源代码库中的一个辅助功能模块,可以作为JVM嵌入式cache来使用,基于key-value模型。对于Rdedis、Memcached,这种缓存系统,我们称之为“分布式缓存”,它们通过集群扩容,可以将海量数据cache在远端。而guava cache,作为“嵌入式cache”,这些cache的数据寄宿在当前JVM堆中,和JVM进程具有共同生命周期。它具备如下特点

Talk is cheap, show me the code. ---Linus Torvalds 4589

「Unity3D」Addressable版本冲突解析:SBP与Addressables兼容性问题实战指南

本文深入解析Unity3D中Addressable与SBP(Scriptable Build Pipeline)版本冲突问题,提供实战解决方案。当遇到「Build Task CreateBuiltInShadersBundle failed」错误时,可通过版本匹配、临时资源引用或构建参数调整解决。文章详细分析兼容性原理,并给出版本组合指南与最佳实践,帮助开发者高效处理资源构建问题。

weixin_29001683的博客 410

【MIMIC数据库教程】一、MIMIC-IV3.1表格与字段详解(一):Hosp和ICU模块表格整体介绍

MIMIC-IV 3.1 版本包含住院 (hosp) 和 重症监护 (ICU)提供全院电子病历数据,包括入院信息、实验室测量、微生物学、用药、账单等,共计22 张表。记录重症监护室数据,如静脉注射、呼吸机设置、生命体征等,共计9 张表。

BD_Design_cs的博客 3421

Guava 库新手快速上手与实战指南

摘要 本文针对Java开发中的常见痛点,系统介绍了如何利用工具类库提升开发效率。从环境搭建开始,详细解析了集合操作、字符串处理等高频场景的优化方案,涵盖Apache Commons、Guava等实用工具库的应用技巧。特别针对并发编程难点,提供了JUC工具类的具体使用示例,并介绍了事件总线模式实现模块解耦。通过本地缓存实现、函数式编程等现代开发范式,帮助开发者减少重复代码,构建更健壮的系统架构。无论是新手还是资深工程师,都能从中获得提升代码质量和开发效率的实用方法。

jacky choise 162

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 567

guava cache详细介绍

官方文档:https://github.com/google/guava/wiki/CachesExplained guava cache是google开源的一款本地缓存工具库,它的设计灵感来源于ConcurrentHashMap,使用多个segments方式的细粒度锁,在保证线程安全的同时,支持高并发场景需求,同时支持多种类型的缓存清理策略,包括基于容量的清理、基于时间的清理、基于引用的清理等。 <dependency> <groupId>com.google.gua

赶路人儿 1万+

华中科技大学计算机组成原理-单总线CPU设计(全部通关)

【计算机组成原理】 单总线CPU实验 华中科技大学-计算机组成原理 实验三 单总线CPU设计 第1关 MIPS指令译码器设计 第2关 单总线CPU微程序入口查找逻辑 第3关 单总线CPU微程序条件判别测试逻辑 第4关 单总线CPU微程序控制器设计 第5关 采用微程序的单总线CPU设计 第6关 现代时序硬布线控制器状态机设计 第7关 现代时序硬布线控制器设计

紫荆鱼的博客 4万+

Ubuntu+Dify实战:如何让大模型知识库完美支持图片召回(附避坑指南)

本文详细介绍了在Ubuntu系统上部署Dify平台,并实现大模型知识库图片召回功能的完整实战方案。通过解析Dify处理图片的底层逻辑,重点讲解了配置Nginx代理服务器将本地图片路径转换为可公开访问URL的核心工程步骤,并提供了文档预处理、环境变量配置以及父子分段策略等高级技巧,帮助开发者构建图文并茂的AI应用,有效提升知识库的丰富性和用户体验。

c7d8e的博客 445

Guava Cache之Cache接口

1、通过put或putAll手动向Cache中添加数据,guava不缓存value是null的key。我们可以在系统启动的时候,就将某些数据手动放入缓存中,这样就可以避免系统启动后,第一个用户访问缓存不能命中的情况。2、通过getIfPresent/getAllPresent/get读取缓存中的数据。3、如果明确知道某些缓存无用,我们可以通过invalidate/invalidateAll删除。4、通过调用cleanUp执行缓存清理操作,比如删除过期的key。

aty 5453

YOLOv11 快速入门指南 | 10分钟吃透网络结构与新特性

2024 年 9 月 30 日,Ultralytics 发布了 YOLOv11,这是继 YOLOv8、v9、v10 之后的最新一代实时目标检测模型。 与前几代相比,YOLOv11 在保持“单阶段、实时、端到端”三大基因的同时,带来了两大核心升级:一句话总结:YOLOv11 = 更快 + 更准 + 更少参数。 2.2 微观单元:C3k2 与 C2PSA 2.2.1 C3k2 模块 作用:替换 YOLOv8 的 C2f,做跨阶段局部特征融合。 核心代码(ultralytics/nn/modules/block

shrgegrb的博客 1407

深入解析 Guava Cache

通过解析 Guava Cache 的实现原理,我们发现 Guava LocalCache 与 ConcurrentHashMap 有以下不同:ConcurrentHashMap ”分段控制并发“是隐式的(实现中没有Segment对象),而 LocalCache 是显式的。在 JDK 1.8 之后,ConcurrentHashMap 采用实现:当 put 的元素在哈希桶数组中不存在时,直接 CAS 进行写操作;在发生哈希冲突的情况下使用 synchronized 锁定头节点。

Program_san的博客 2401

【教程4>第8章>第44节】本章整体思维导图与学习总结

本教程系列提供FPGA/MATLAB/Simulink学习资源,包含《MATLAB入门100例》、《FPGA入门100例》、《Simulink入门60例》等基础教程,以及《FPGA/MATLAB/Simulink联合开发》进阶教程和《人工智能基础应用研究》专题,适合不同层次的学习者系统掌握相关技术。

FPGA/MATLAB学习教程/源码/项目合作开发 448

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

高并发之——Guava Cache

最近需要用到缓存来存放临时数据,又不想采用Redis,Java自带的Map功能太少,发现Google的Guava提供的Cache模块功能很强大,于是选择使用它。 本地缓存 本地缓存作用就是提高系统的运行速度,是一种空间换时间的取舍。它实质上是一个做key-value查询的字典,但是相对于我们常用HashMap它又有以下特点: 1.并发性:由于目前的应用大都是多线程的,所以缓存需要支持并发的写...

冰河的专栏 6823

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Guava cache缓存实践

在我们日常开发中,如果某些数据会频繁的进行读取,并且很少会做修改,我们一般会对这些数据进行缓存,来提高读取的速度。 使用缓存之所以能提高性能,是因为读取的速度比从磁盘或数据库中读取的速度更高。 但是使用缓存并不是全部都是好处,因为存放缓存数据的空间一般都是CPU内存,或者Redis等,它们的空间更宝贵,是典型的空间换时间,所以需要放到缓存中的数据应该是.

小黑说Java 598

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

上一篇: JAVA中try-catch异常逃逸
下一篇: JAVA中BitSet使用
shift_alt_ctrl
博客等级 码龄10年 0粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值