alibaba JetCache:给 Java 缓存这件事做了一层统一抽象 文章目录alibaba JetCache给 Java 缓存这件事做了一层统一抽象1、它解决的真问题2、核心能力3、上手最简形态4、自动刷新与穿透保护5、脱离注解的编程式用法6、Spring Boot 接入7、它适合什么场景8、版本与兼容性alibaba JetCache给 Java 缓存这件事做了一层统一抽象JetCache 在 GitHub 上已经拿到 5.5K Star 了。阿里巴巴开源了这个 Java 缓存框架把 Redis、Caffeine、Tair 这些相互不兼容的缓存方案统一到同一套 API 和注解下面。Spring Cache 能做的它都能做做不了的 TTL、多级缓存、分布式自动刷新它也补上了。1、它解决的真问题写 Java 后端躲不开缓存。本地缓存用 Caffeine分布式缓存用 Redis两套 API 完全不一样代码里到处是if (cache.contains(key))这类零碎判断。Spring Cache 注解虽好但原生不支持 TTL也不支持多级缓存刷新还得自己写。JetCache 把这层磨平了。一个Cached注解下去本地缓存、远程缓存、本地远程两级缓存配置里一开关就切换业务代码不动。Cache接口长得像Mapget、put、computeIfAbsent都在迁移成本很低。2、核心能力注解声明式方法缓存原生支持 TTL 和两级缓存统一的CacheAPI可以脱离注解直接编码操作分布式环境下的自动刷新和分布式锁2.7 版本支持跨 JVM 实例的本地缓存失效异步访问基于 Redis Lettuce 客户端键生成和值序列化策略都可以定制键转换器支持 fastjson2、jackson、jackson3接入 Spring Bootstarter配置文件一贴就能跑3、上手最简形态给方法加缓存就一行注解。expire 3600表示 3600 秒后过期cacheType CacheType.REMOTE指定走远程缓存。键由 JetCache 根据参数自动生成。publicinterfaceUserService{Cached(expire3600,cacheTypeCacheType.REMOTE)UsergetUserById(longuserId);}需要自定义 key用 SpEL 表达式Cached(nameuserCache-,key#userId,expire3600)UsergetUserById(longuserId);CacheUpdate(nameuserCache-,key#user.userId,value#user)voidupdateUser(Useruser);CacheInvalidate(nameuserCache-,key#userId)voiddeleteUser(longuserId);读取、更新、删除三个注解配齐CRUD 不用手动维护缓存。4、自动刷新与穿透保护分布式场景下缓存过期瞬间压垮数据库是常见问题。JetCache 的CacheRefresh可以在缓存还活着的时候后台异步刷新stopRefreshAfterLastAccess控制多久没访问就停止刷新。CachePenetrationProtect防止并发时多个线程同时回源加载。Cached(expire3600,cacheTypeCacheType.REMOTE)CacheRefresh(refresh1800,stopRefreshAfterLastAccess3600,timeUnitTimeUnit.SECONDS)CachePenetrationProtectBigDecimalsummaryOfToday(longcategoryId);5、脱离注解的编程式用法有时候注解不够灵活需要直接拿Cache实例。QuickConfig构造一个两级缓存本地最多 50 个元素LRU更新时通过广播让所有 JVM 实例失效本地缓存。QuickConfigqcQuickConfig.newBuilder(userCache).expire(Duration.ofSeconds(100)).cacheType(CacheType.BOTH).localLimit(50).syncLocal(true).build();userCachecacheManager.getOrCreateCache(qc);userCache.computeIfAbsent(1234567L,(key)-loadUserFromDataBase(1234567L));异步 API 也在CacheGetResult返回一个CompletionStage配合tryLockAndRun实现分布式锁。6、Spring Boot 接入依赖加进来dependencygroupIdcom.alicp.jetcache/groupIdartifactIdjetcache-starter-redis/artifactIdversion${jetcache.latest.version}/version/dependency启动类加EnableMethodCacheapplication.yml 配一下本地和远程缓存类型、键转换器、序列化器、连接池就齐活了。7、它适合什么场景业务里有高频读、低频写的方法希望加缓存又不想自己拼装注解和缓存管理器同时用本地缓存和 Redis想让两级缓存自动协同单机部署后期可能切到分布式希望切换成本最小团队里缓存写法五花八门需要一套统一抽象做规范8、版本与兼容性2.8 及以上版本要求 JDK 17支持 Spring Framework 6.x 和 Spring Boot 3.x。2.7 及更早版本兼容 JDK 8老项目想平滑接入也留了路。Java 缓存这块以前是个琐碎活Caffeine 管本地、Redis 管远程、Spring Cache 管注解、自己管刷新和锁。JetCache 把这几样捏到一起注解一套、API 一套开发期不用关心底层缓存是什么运维期可以按需切换。做 Java 后端如果还在手写缓存协调逻辑可以试试。Spring Cache 管注解、自己管刷新和锁。JetCache 把这几样捏到一起注解一套、API 一套开发期不用关心底层缓存是什么运维期可以按需切换。做 Java 后端如果还在手写缓存协调逻辑可以试试。

相关新闻

最新新闻

ADC模数转换器:从核心原理到电路设计与调试实战

ADC模数转换器:从核心原理到电路设计与调试实战

1. 项目概述:从模拟到数字的桥梁在电子系统里,我们常常会遇到一个核心矛盾:自然界产生的信号,比如声音、温度、压力、光线,都是连续变化的模拟量;而我们赖以进行计算、存储和传输的微处理器、计算机&#x…

2026/8/27 4:47:41
ESP32复古哑终端DIY:用VGA与PS/2键盘打造纯正CRT时代交互体验

ESP32复古哑终端DIY:用VGA与PS/2键盘打造纯正CRT时代交互体验

最近在整理房间时翻出一台老戴尔的VGA显示器,突然特别想做一台上世纪七八十年代那种象牙白色的哑终端。所谓Retro Dumb Terminal,核心理念就一个字:哑。它自己不跑程序、不装系统,只负责把键盘输入发出去、把主机返回的字符显示在…

2026/8/27 4:47:41
开源飞控入门:Ardupilot与PX4环境搭建与仿真实战

开源飞控入门:Ardupilot与PX4环境搭建与仿真实战

1. 项目概述:两个开源飞控巨头,到底该怎么选做无人机开发这几年,我被问得最多的一个问题就是:Ardupilot和PX4到底选哪个?说实话,这个问题没有标准答案,但你要是搞不清楚两者的来龙去脉就贸然入坑…

2026/8/27 4:47:41
服装电商库存与SKU建模:SpringBoot多维属性矩阵与状态机实践

服装电商库存与SKU建模:SpringBoot多维属性矩阵与状态机实践

简介:在电商系统中,SKU(库存量单位)和库存管理是核心数据能力。普通商品通常采用固定规格字段建模,但服装行业面临颜色、尺码、季节、版型等多维属性组合爆炸问题,导致传统JPA实体映射失效、缓存键失准、N1…

2026/8/27 4:47:41
实测书匠策AI后,我终于敢回答“AI写论文哪个软件最好”了

实测书匠策AI后,我终于敢回答“AI写论文哪个软件最好”了

官网:www.shujiangce.com | 微信公众号 :书匠策AI 做教育测评这些年,被问到最多的问题就是:“老师,AI写论文的软件那么多,到底哪个最好?” 说实话,每次被问这个问题&#xff0…

2026/8/27 4:47:41
C++类模板作为函数参数的三种正确用法

C++类模板作为函数参数的三种正确用法

1. 项目概述&#xff1a;为什么类模板作为函数参数不是“炫技”&#xff0c;而是工程落地的刚需你写过这样的代码吗&#xff1f;一个Stack类&#xff0c;专门存int&#xff1b;另一个Stack类&#xff0c;专门存string&#xff1b;再写一个&#xff0c;存vector<double>……

2026/8/27 4:42:41