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特别适合单机、高频读取、数据量可控的场景,是提升系统性能的利器。

相关推荐
此生只爱蛋16 小时前
【Redis】Set 集合
数据库·redis·缓存
于归pro20 小时前
Redis 基础命令、核心概念与安装验证完整指南
数据库·redis·缓存
高山上有一只小老虎21 小时前
使用Memory Analyzer (MAT)分析内存溢出
java·jvm
ss27321 小时前
自定义线程池:从工作原理到实战验证
java·开发语言·jvm
西贝爱学习1 天前
【Redis安装】Redis压缩包Redis-x64-5.0.14.1.zip
数据库·redis·缓存
ELI_He9991 天前
FunASR AutoModel 设置本地缓存路径
缓存
星辰_mya1 天前
Redis持久化
数据库·redis·缓存
橘子真甜~1 天前
Reids命令原理与应用1 - Redis命令与原理
数据库·c++·redis·缓存
与遨游于天地1 天前
了解Redis
数据库·redis·缓存
Bruce_Liuxiaowei1 天前
一键清理Chrome浏览器缓存:批处理与PowerShell双脚本实现
前端·chrome·缓存