实用指南:Guava Cache 高性能本地缓存库详解与使用案例

news/2025/11/9 10:38:08/文章来源:https://www.cnblogs.com/ljbguanli/p/19203876

实用指南:Guava Cache 高性能本地缓存库详解与使用案例

Guava Cache 高性能本地缓存库详解与使用案例


一、Guava Cache 简介

1.1 什么是 Guava Cache?

Guava Cache 是 Google 提供的 Java 本地缓存库,是 Google Guava 工具库的一部分。它提供了灵活且高效的缓存管理功能,适用于需要高性能、低延迟的本地缓存场景。核心特性包括:

  • 基于大小和时间的缓存驱逐
  • 软引用/弱引用支持
  • 缓存统计(命中率、加载次数等)
  • 手动刷新与异步加载
  • 缓存监听器

Guava Cache 适用于单体应用、微服务中的本地缓存需求,尤其适合对缓存性能要求较高的场景。


二、核心特性详解

2.1 依赖引入

Maven
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
Gradle
implementation 'com.google.guava:guava:31.1-jre'

2.2 缓存构建器 CacheBuilder

Guava Cache 的核心是通过 CacheBuilder 构建缓存实例,支持链式配置。

2.2.1 基本缓存创建
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100)// 最大缓存大小.build();
2.2.2 基于时间的过期策略
  • 写入后过期(expireAfterWrite):元素在写入后指定时间过期。
  • 访问后过期(expireAfterAccess):元素在最后一次访问后指定时间过期。
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(10, TimeUnit.MINUTES)// 写入后10分钟过期.expireAfterAccess(5, TimeUnit.MINUTES)// 最后一次访问后5分钟过期.build();
2.2.3 基于大小的驱逐策略

Guava 使用 LRU(Least Recently Used) 算法管理缓存大小。

Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000)// 缓存最多存储1000个元素.build();
2.2.4 软引用/弱引用
  • 软引用(Soft References):在 JVM 内存不足时回收。
  • 弱引用(Weak References):在下一次 GC 时回收。
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100).softValues()// 值使用软引用.weakKeys()// 键使用弱引用.build();
2.2.5 缓存统计

启用统计功能可获取命中率、加载次数等信息。

Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100).recordStats()// 启用统计.build();// 获取统计信息CacheStats stats = cache.stats();System.out.println("命中率: " + stats.hitRate());
2.2.6 手动刷新与异步加载
  • 手动刷新refresh(key) 强制刷新指定缓存项。
  • 异步加载:结合 LoadingCache 实现异步加载。
LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) throws Exception {return fetchFromDB(key);// 从数据库加载}});// 异步加载String value = loadingCache.get("key");

2.3 缓存监听器

通过 RemovalListener 监听缓存项被驱逐或过期。

Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100).removalListener((RemovalListener<String, String>) notification -> {System.out.println("Key: " + notification.getKey() + " 被移除,原因: " + notification.getCause());}).build();

三、使用案例详解

3.1 单体应用缓存

场景:用户信息缓存
public class UserService {
private final LoadingCache<String, User> userCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<String, User>() {@Overridepublic User load(String userId) throws Exception {return fetchUserFromDB(userId);// 从数据库加载}});public User getUser(String userId) {try {return userCache.get(userId);// 自动加载或从缓存获取} catch (ExecutionException e) {throw new RuntimeException("缓存加载失败", e);}}private User fetchUserFromDB(String userId) {// 模拟数据库查询return new User(userId, "User_" + userId);}}
优势:
  • 减少数据库压力:高频查询直接命中缓存。
  • 自动刷新:Guava 自动管理缓存更新。

3.2 分布式系统中的本地缓存

场景:结合 Redis 的二级缓存

Guava Cache 作为本地缓存,Redis 作为分布式缓存。

public class DistributedCache {
private final Cache<String, String> localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(5, TimeUnit.MINUTES).build();public String get(String key) {String value = localCache.getIfPresent(key);if (value == null) {value = fetchFromRedis(key);if (value == null) {value = fetchFromDB(key);saveToRedis(key, value);}localCache.put(key, value);}return value;}}
优势:
  • 本地缓存加速:减少对 Redis 的直接访问。
  • 降级容错:Redis 不可用时可直接访问数据库。

3.3 Spring Boot 集成

1. 配置缓存 Bean
@Configuration
public class CacheConfig {
@Bean
public Cache<String, String> myCache() {return CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build();}}
2. 使用缓存
@Service
public class MyService {
@Autowired
private Cache<String, String> myCache;public String getData(String key) {String value = myCache.getIfPresent(key);if (value == null) {value = fetchFromExternalService(key);myCache.put(key, value);}return value;}}

四、性能优化技巧

4.1 避免缓存雪崩

// 随机过期时间(需结合自定义逻辑)
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();

4.2 缓存命中率优化

  • 合理设置大小:根据业务访问模式调整 maximumSize
  • 监控统计:定期分析 hitRate()evictionCount(),调整策略。
CacheStats stats = cache.stats();
System.out.println("命中率: " + stats.hitRate());

4.3 内存管理

  • 软引用值(softValues):在 JVM 内存不足时自动回收缓存。
  • 定期清理:使用 cleanUp() 手动触发清理。
cache.cleanUp(); // 手动清理过期缓存

五、常见问题与解决方案

5.1 缓存穿透(Cache Penetration)

问题:查询不存在的数据导致频繁访问数据库。
解决方案

String value = cache.get(key, () -> {
String result = fetchFromDB(key);
if (result == null) {
cache.put(key, "");// 缓存空值
}
return result;
});

5.2 缓存击穿(Cache Breakdown)

问题:热点数据过期后大量请求直接访问数据库。
解决方案

  • 互斥锁(Mutex Lock):仅允许一个线程重建缓存。
  • 永不过期:热点数据设置永不过期,定时异步更新。
String value = cache.get(key, () -> {
synchronized (key.intern()) {
if (cache.getIfPresent(key) == null) {
String result = fetchFromDB(key);
cache.put(key, result);
return result;
}
}
return cache.getIfPresent(key);
});

5.3 缓存雪崩(Cache Avalanche)

问题:大量缓存同时失效,导致数据库压力激增。
解决方案

  • 随机过期时间:为缓存设置随机过期时间。
  • 分层缓存:本地缓存 + Redis 分布式缓存。

六、Guava Cache 与 Caffeine 对比

特性Guava CacheCaffeine
算法LRU(较简单)Window TinyLFU(更高命中率)
异步加载不支持(需手动实现)支持 AsyncLoadingCache
统计功能基本统计详细统计(命中率、加载次数等)
性能一般(适合中等规模应用)更高吞吐量和更低延迟
维护状态已停止更新(推荐使用 Caffeine)活跃维护

七、总结

Guava Cache 是 Java 生态中经典的本地缓存库,其 灵活配置、稳定性和易用性 使其成为许多项目的首选。通过合理配置缓存策略,开发者可以显著提升系统性能,减少对数据库的依赖。尽管 Caffeine 在性能上更优,但 Guava Cache 仍然是许多遗留项目和中等规模应用的可靠选择。


八、参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习进阶(一)——从 LeNet 到 Transformer:卷积的荣光与注意力的崛起 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年热门的剧院舞台灯光厂家最新推荐榜

2025年热门的剧院舞台灯光厂家最新推荐榜行业背景与市场趋势随着文化娱乐产业的蓬勃发展,全球舞台灯光市场规模持续扩大。据最新行业报告显示,2024年全球舞台灯光市场规模已达到85亿美元,预计到2025年将突破90亿美元…

2025年知名的火车宠物托运用户好评榜

2025年知名的火车宠物托运用户好评榜 行业背景与市场趋势 随着宠物经济的蓬勃发展,宠物托运行业近年来呈现快速增长态势。据《2024年中国宠物行业白皮书》数据显示,中国宠物市场规模已突破5000亿元,其中宠物托运服…

2025年专业的短视频运营本地优质榜

2025年专业的短视频运营本地优质榜:行业趋势与优质服务商推荐行业背景与市场趋势短视频行业在2025年已进入深度整合与专业化发展阶段。根据《2025中国短视频行业发展白皮书》显示,中国短视频用户规模已达9.8亿,占网…

中文机器阅读理解数据集:7000条高质量问答数据,涵盖搜索与知道双场景,支持DESCRIPTION:YES_NO:ENTITY多类型问题,适用于BERT:GPT等模型训练与评估

参考数据:机器阅读理解数据集引言与背景 在人工智能快速发展的今天,机器阅读理解(Machine Reading Comprehension, MRC)作为自然语言处理领域的核心任务之一,正受到学术界和工业界的广泛关注。机器阅读理解要求模…

2025年11月货架厂家推荐榜:五强对比评测与选购全解析

在“双11”后的补货高峰与年末库存盘点双重压力下,2025年11月成为仓储升级的关键窗口。中小企业主、第三方物流仓、连锁零售配销中心三类人群最常面临“货架承重不足、通道浪费、交付延期”三大痛点:一方面,临时加租…

2025年优秀的涂装喷砂房最新TOP排名厂家

2025年优秀的涂装喷砂房最新TOP排名厂家随着中国制造业的持续升级和环保要求的不断提高,涂装喷砂房作为表面处理的关键设备,其市场需求呈现出稳定增长态势。根据中国表面工程协会最新数据显示,2024年我国涂装喷砂设…

2025年靠谱的品牌展厅设计展示空间创新设计榜

2025年靠谱的品牌展厅设计展示空间创新设计榜行业背景与市场趋势随着体验经济的崛起和品牌竞争的加剧,品牌展厅设计已成为企业战略传播的重要载体。根据《2024年中国展览展示行业白皮书》数据显示,2023年中国品牌展厅…

2025年优秀的海外短信平台用户推荐权威榜

2025年优秀的海外短信平台用户推荐权威榜行业背景与市场趋势随着全球数字化进程加速,海外短信服务已成为企业国际化战略中不可或缺的一环。根据最新市场研究数据显示,2024年全球企业短信市场规模已达到487亿美元,预…

2025年11月geo优化服务商推荐榜:五强服务差异与风险中性提示

当企业准备把品牌信息同步到DeepSeek、豆包、通义千问、元宝、Kimi等生成式引擎时,如何找到既懂技术又懂行业的geo优化服务商,成为市场、公关与增长团队共同的焦虑点:预算有限,却希望一次部署就能覆盖多平台;算法…

[ docker context ]

docker context 可以用于隔离不同的 Docker 环境(如不同项目、不同服务器、不同容器引擎等),通过切换 context 可以快速切换 Docker 客户端的连接目标(例如本地 Docker 引擎、远程服务器上的 Docker 引擎、Docker …

2025年11月geo优化服务商实力推荐榜:头部案例与落地流程全公开

把“到底该选谁”的焦虑放一边,先回到你最真实的场景:品牌刚完成AI化升级,却发现DeepSeek、豆包、通义千问给出的答案版本不一;新品上市倒计时,搜索端口径混乱导致潜客流失;集团总部要求季度汇报必须附上AI可见度…

Zabbix服务告警:Zabbix server: Utilization of discoverer processes over 75%

在 Zabbix 中,discoverer 进程负责自动发现任务,用于周期性扫描 IP 段、检测设备是否在线,发现主机上的磁盘、网卡、文件系统等资源。Zabbix Server 在启动时会根据配置文件参数生成一定数量的 discoverer 进程,它…

2025年优质的合规管理知识产权贯标热门口碑排行榜

2025年优质的合规管理知识产权贯标热门口碑排行榜行业背景与市场趋势随着全球经济一体化进程加速和知识经济时代的到来,知识产权已成为企业核心竞争力的关键要素。2025年,中国知识产权服务业市场规模预计突破5000亿元…

2025年11月豆包排名优化实力推荐:五强对比助企业精准决策

开场白 “我的品牌刚被豆包收录,可排名总在第三屏以后,流量寥寥,预算却一天比一天紧。”——这是过去一个月里,我们收到的最高频的求助信号。企业既担心错过AI搜索的红利,又害怕投入不见水花,于是“谁能把豆包排…

2025年11月货架厂家推荐榜:陕西三禾领衔全维度对比评测

2025年11月,企业仓库升级、电商前置仓扩建、制造业线边库改造同步进入旺季,货架采购需求集中爆发。面对“承重是否够、交期是否准、后期维护谁负责”三大痛点,多数采购人先在搜索引擎里输入“货架厂家”,再被上千条…

2025年11月北京geo优化公司推荐榜:五强服务链路深度拆解

开场白 “预算有限却想同时覆盖豆包、DeepSeek、通义千问,到底该找谁?”这是最近三个月里企业市场部门最高频的提问。AI搜索流量入口高度碎片化,算法周级迭代,内部团队从零搭建GEO体系平均耗时六个月以上,且需要持…

2025年11月豆包搜索排名优化推荐盘点:五强方案覆盖全平台算法

当品牌方在豆包、DeepSeek、通义千问等生成式引擎里搜索自家关键词,却发现结果页被竞品占据,这种“隐身”焦虑正在批量出现。2025年第四季度,AI日活突破8亿,算法迭代周期缩短至7天,传统SEO逻辑彻底失灵,企业急需…

2025年11月北京geo优化公司推荐榜:场景化选择全攻略

开场白 “预算批了,可到底把GEO项目交给谁?”这是11月北京市场部最常出现的焦虑。AI搜索流量入口越来越分散,DeepSeek、豆包、通义千问、元宝、Kimi五家算法同场竞技,一条内容五套标准,品牌方既怕错过红利,又怕踩…

2025年11月豆包搜索排名优化服务推荐:五强实力剖析与落地步骤

当品牌方在豆包等生成式引擎的搜索结果里找不到自己,当新品发布的内容被算法淹没,当竞品却持续占据可见位置,焦虑便随之而来。2025年第四季度,AI平台日均迭代三次以上,传统SEO逻辑已无法直接迁移,企业需要一套面…