Guava LoadingCache

LoadingCache 是 Google Guava 库提供的一个高级缓存实现,它通过自动加载机制简化了缓存使用模式。

核心特性

自动加载机制

当缓存未命中时,自动调用指定的 CacheLoader 加载数据

线程安全:并发请求下,相同key只会加载一次

灵活的过期策略

支持基于写入时间(expireAfterWrite)和访问时间(expireAfterAccess)的过期

可设置最大缓存大小,基于LRU策略淘汰

丰富的统计功能

可记录命中率、加载异常等指标

通过 CacheStats 对象提供详细统计数据

典型使用场景

优惠券模板缓存实现

java 复制代码
LoadingCache<Long, Optional<CouponTemplate>> couponCache = CacheBuilder.newBuilder()
    .maximumSize(10000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(new CacheLoader<Long, Optional<CouponTemplate>>() {
        @Override
        public Optional<CouponTemplate> load(Long templateId) {
            // 数据库查询逻辑
            CouponTemplate template = couponDao.findById(templateId);
            return Optional.ofNullable(template);
        }
    });

性能关键场景优势

零拷贝访问:缓存数据直接存储在JVM堆内存中

高吞吐量:单机可达10万+ QPS

低延迟:读取操作通常在微秒级完成

高级功能

刷新机制

复制代码
// 单个key刷新
cache.refresh(key);

// 批量刷新
cache.refreshAll(keys);

统计功能启用

复制代码
CacheBuilder.newBuilder()
    .recordStats()  // 启用统计
    .build(loader);

// 获取统计信息
CacheStats stats = cache.stats();
double hitRate = stats.hitRate();  // 命中率

注意事项

内存管理

需要合理设置 maximumSize 防止OOM

对于大对象考虑使用软/弱引用

异常处理

load 方法抛出异常会被缓存

建议返回 Optional 包装空值

分布式环境

本地缓存不适用于多节点场景

可考虑与Redis组成多级缓存

LoadingCache特别适合单机、高频读取、数据量可控的场景,是提升系统性能的利器。

相关推荐
消失的旧时光-194321 分钟前
第十四课:Redis 在后端到底扮演什么角色?——缓存模型全景图
java·redis·缓存
野犬寒鸦44 分钟前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
消失的旧时光-19432 小时前
第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)
spring boot·redis·缓存
池央2 小时前
CANN Catlass 算子模板库深度解析:GEMM 核心优化、模板元编程与片上缓存策略的协同
缓存
闻哥3 小时前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
这周也會开心3 小时前
Redis数据类型的底层实现和数据持久化
数据库·redis·缓存
My LQS4 小时前
使用 Redis Stack 向量索引构建大模型问答缓存系统
redis·缓存·ai
星辰_mya4 小时前
Elasticsearch线上问题之慢查询
java·开发语言·jvm
蓝帆傲亦5 小时前
代码革命!我用Claude Code 3个月完成1年工作量,这些实战经验全给你
jvm·数据库·oracle
Codiggerworld18 小时前
JVM内存模型——你的对象住在哪里?
jvm