alibaba JetCache:给 Java 缓存这件事做了一层统一抽象

发布时间:2026/7/8 12:34:48

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 后端如果还在手写缓存协调逻辑可以试试。

相关新闻