LoadingCache
是 Google Guava 库提供的一个高级缓存实现,它通过自动加载机制简化了缓存使用模式。
核心特性
自动加载机制
当缓存未命中时,自动调用指定的
CacheLoader
加载数据线程安全:并发请求下,相同key只会加载一次
灵活的过期策略
支持基于写入时间(
expireAfterWrite
)和访问时间(expireAfterAccess
)的过期可设置最大缓存大小,基于LRU策略淘汰
丰富的统计功能
可记录命中率、加载异常等指标
通过
CacheStats
对象提供详细统计数据
典型使用场景
优惠券模板缓存实现
LoadingCache<Long, Optional<CouponTemplate>> couponCache = CacheBuilder.newBuilder().maximumSize(10000).expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<Long, Optional<CouponTemplate>>() {@Overridepublic 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特别适合单机、高频读取、数据量可控的场景,是提升系统性能的利器。