guava
缓存分为:本地缓存 分布式缓存
本地缓存:
https://blog.csdn.net/weixin_42578444/article/details/80878611
guava和ehcache都是本地缓存,在guava之前用的是ConcurrentMap,因为能友好的支持并发。但它并不支持缓存的一些特性,比如缓存过期、缓存数据加载和刷新
使用场景:1、愿意消耗一些本地内存空间提升速度 2、更新锁定当某个缓存失效的时候,大量请求去查询某一个key 当这个key不存在,就会导致多次从数据库中加载数据,Guava cache 可以在cacheloader 的 load方 法众加以控制,对同一个key只让一个请求去数据库众读取数据,而其他请求阻塞等待结果。
Guava Cache
1.使用key, value 的形式存储数据 LoadingCache<String, TestCase> testCaseExecLoadingCache
2.定义缓存对象,重写接口:load接口,当get的不存在的时候,调用load方法
testCaseExecLoadingCache = CacheBuilder.newBuilder()
.refreshAfterWrite(3, TimeUnit.HOURS)// 给定时间内没有被读/写访问,则回收。
.expireAfterAccess(16, TimeUnit.HOURS)// 缓存过期时间和redis缓存时长一样
.maximumSize(800)// 设置缓存个数
.build(new CacheLoader<String, TestCase>() {
@Override
/** 当本地缓存命没有中时,调用load方法获取结果并将结果缓存 **/
public TestCase load(String testCaseCacheKey) throws SQLiteAccessException {
/** 拆分testCaseCacheKey,格式:fileMD5{}testCaseFullPath*/
String testCaseFullPath = Common.substringAfter(testCaseCacheKey, "{}");
System.out.println("load 无缓存" + testCaseFullPath);
return findTestCaseFile(testCaseFullPath);
}
/**
* jarKey组装逻辑为 jarId{}jarFileName,获取class list
* @param tesCaseKey 全路径
* @return
*/
private TestCase findTestCaseFile(String tesCaseFullPath) {
TestCase oTestCase = null;
try {
TestCaseFile oCaseFile = new TestCaseFile(tesCaseFullPath);
oTestCase = oCaseFile.readCaseRoot();
}catch(Exception e) {
}
return oTestCase;
}
});
3.提供 put/get/invalidate方法等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了