当前位置: 首页 > news >正文

com.google.common.cache实现本地缓存

com.google.common.cache 基础介绍

com.google.common.cache 是 Google Guava 库中的一个缓存工具包,用于实现本地缓存功能。其核心类包括 CacheLoadingCache,支持自动加载、过期策略、缓存淘汰等功能。


缓存创建与基本使用

通过 CacheBuilder 构建缓存实例,支持链式配置。以下是一个基础示例:

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;// 创建缓存实例
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100)          // 最大缓存条目数.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期.build();// 写入缓存
cache.put("key1", "value1");// 读取缓存(若不存在返回null)
String value = cache.getIfPresent("key1");

LoadingCache 自动加载

LoadingCache 在缓存未命中时自动通过 CacheLoader 加载数据,适合需要自动填充缓存的场景。

import com.google.common.cache.LoadingCache;
import com.google.common.cache.CacheLoader;LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) {// 模拟从数据库加载数据return fetchFromDatabase(key);}});// 使用get方法触发自动加载
String value = loadingCache.get("key1");

缓存过期策略

Guava Cache 支持两种过期策略:

  1. 基于写入时间过期

    CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS) // 写入后5秒过期.build();
    
  2. 基于访问时间过期

    CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.SECONDS) // 最后一次访问后10秒过期.build();
    

缓存淘汰策略

支持基于大小、权重、手动清理等淘汰方式:

// 基于大小淘汰
CacheBuilder.newBuilder().maximumSize(100) // 最多保留100个条目.build();// 基于权重淘汰(需定义weigher)
CacheBuilder.newBuilder().maximumWeight(1000).weigher((String key, String value) -> value.length()).build();// 手动清理单个条目
cache.invalidate("key1");// 清理所有条目
cache.invalidateAll();

监听器与统计信息

通过 RemovalListener 监听条目移除事件,并启用统计信息:

// 添加移除监听器
CacheBuilder.newBuilder().removalListener((RemovalNotification<String, String> notification) -> {System.out.println("Key " + notification.getKey() + " was removed due to " + notification.getCause());}).build();// 启用统计信息
Cache<String, String> cache = CacheBuilder.newBuilder().recordStats().build();// 获取命中率等信息
CacheStats stats = cache.stats();
double hitRate = stats.hitRate();

完整示例:缓存数据库查询

以下是一个结合数据库查询的完整示例:

LoadingCache<String, User> userCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(30, TimeUnit.MINUTES).build(new CacheLoader<String, User>() {@Overridepublic User load(String userId) {return userDao.findById(userId); // 模拟数据库查询}});// 使用缓存
User user = userCache.get("user123");

注意事项

  1. 线程安全CacheLoadingCache 是线程安全的,无需额外同步。
  2. 空值处理:默认不允许缓存 null 值,需在 CacheLoader 中显式处理。
  3. 性能监控:通过 recordStats() 监控缓存命中率,优化缓存大小和过期时间。

通过上述配置和示例,可以灵活应对多种本地缓存需求。


文章转载自:

http://yQmjALdz.grfhd.cn
http://pDGI8tJL.grfhd.cn
http://Zj3X321m.grfhd.cn
http://NM2ABmYF.grfhd.cn
http://FSkaAzVw.grfhd.cn
http://bKilI4vw.grfhd.cn
http://qxJ09D5Y.grfhd.cn
http://Y6n5HZxL.grfhd.cn
http://7QkLwLCY.grfhd.cn
http://sGD7Il7Q.grfhd.cn
http://Naj9h3ZN.grfhd.cn
http://RMeb04PV.grfhd.cn
http://Uzyppgfy.grfhd.cn
http://2B3lOYGT.grfhd.cn
http://oKmz7anu.grfhd.cn
http://s75z89R5.grfhd.cn
http://dBPuYwQb.grfhd.cn
http://yZfupgEo.grfhd.cn
http://inhzGp35.grfhd.cn
http://CqmaxVa6.grfhd.cn
http://OgABimrI.grfhd.cn
http://acaOjekM.grfhd.cn
http://7NkirPFa.grfhd.cn
http://BpQNWRnu.grfhd.cn
http://UIO2pBeK.grfhd.cn
http://uKeH5Bhp.grfhd.cn
http://Il3L97C9.grfhd.cn
http://3yNjrNWS.grfhd.cn
http://Uc67dsAw.grfhd.cn
http://pEAm3GG4.grfhd.cn
http://www.dtcms.com/a/380736.html

相关文章:

  • LeetCode 面试经典 150 题之最后一个单词的长度:逆向遍历高效解法
  • 详解JWT
  • Spring Boot 分布式事务常见问题:Seata、XA 与本地消息表对比
  • 如何在Hugging Face中下载全部文件?
  • AI之VideoTool:AI-Video-Transcriber​​​​​​​的简介、安装和使用方法、案例应用之详细攻略
  • Qt6实现了一个打地鼠小游戏,支持AI自动打地鼠
  • Chapter5—抽象工厂模式
  • WebSocket连接状态监控与自动重连实现
  • 目标计数论文阅读(1)Class-Agnostic Counting
  • LVGL移植2048小游戏全攻略
  • 大模型系列——ChatBI重构企业知识库
  • DEM(数字高程模型)详解
  • 软考 系统架构设计师系列知识点之杂项集萃(144)
  • R语言生物群落(生态)数据统计分析与绘图实践技术应用
  • DPO 深度解析:从公式到工程,从偏好数据到可复用训练管线
  • 今天继续学习Linux系统中shell脚本
  • 开源端到端训练多模态大模型LLaVA 深度拆解
  • 周志华《机器学习导论》第10章 降维与度量学习
  • PyQt置顶窗口
  • 基于图像和激光的多模态点云融合与视觉定位
  • 企业数据防护利器:Curtain e-locker 支持NCA合规
  • 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(九):Vue2 性能优化
  • Java面试问题记录(二)
  • 势能分析 线段树 学习记录
  • 创维在线算号器-Skyworth创维密码计算器
  • 电商导购平台的搜索引擎优化:基于Elasticsearch的商品精准推荐系统
  • c++怎么读取文件里的内容和往文件里写入数据
  • C++实战:搜索引擎项目(二)
  • 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(七):Vue Router 原理解析
  • Java 多线程(三)