【缓存】----阿里JetCache从入门到精通:多级缓存完整实战教程
前言 在高并发业务中单纯使用**Spring Cache** 或裸写Redis会存在短板无法原生支持本地远程二级缓存、过期时间控制繁琐、缺少分布式自动刷新、缓存穿透防护需要手动编码。阿里开源**JetCache** 作为通用缓存抽象框架完美解决以上痛点原生集成**Caffeine**本地缓存、Redis分布式缓存一套注解统一管理多级缓存广泛用于阿里系及互联网高并发项目。本文从零讲解安装、对比、注解实战、API编程、缓存三大问题解决方案附带完整可运行代码与架构流程图。一、什么是JetCache 1.1 核心定义JetCache是阿里巴巴开源Java缓存框架提供统一缓存抽象层兼容本地内存缓存、分布式远程缓存内置AOP注解、原生TTL、多级缓存、定时自动刷新、空值缓存防穿透能力。1.2 核心架构流程图LOCAL本地REMOTE远程BOTH多级缓存业务代码JetCache统一API/注解CacheType类型Caffeine/LinkedHashMapRedis/Tair先查本地Caffeine未命中查询Redis回写本地缓存数据库DB1.3 核心特性注解式缓存Cached/CacheUpdate/CacheInvalidate无侵入业务多级缓存**CacheType.BOTH**本地远程组合QPS提升数倍自定义过期时间**expire**支持秒/分/时单位分布式自动缓存刷新**CacheRefresh**空值缓存**cacheNullValuetrue** 原生防缓存穿透统一序列化FastJSON/Jackson/Java序列化自由切换二、JetCache同类框架对比 ⚖️2.1 主流缓存框架横向对比表框架多级缓存原生支持注解TTL配置分布式自动刷新学习成本适用场景JetCache✅ 内置LOCALBOTH✅ 注解直接expire✅ 原生CacheRefresh低高并发微服务、读多写少Spring Cache❌ 需手动整合CaffeineRedis❌ 依赖缓存组件配置❌ 无极低简单单机缓存、低并发Redisson❌ 仅远程Redis❌ 代码硬编码过期❌ 无中纯Redis分布式锁、复杂Redis指令Caffeine❌ 仅本地内存❌ 代码控制❌ 单机刷新低单机本地缓存2.2 选型结论微服务分布式、追求高性能多级缓存优先**JetCache**简单单机、无分布式需求Caffeine仅需Redis分布式锁、复杂Redis操作Redisson三、JetCache环境安装与配置 ️基于**SpringBoot 2.7.x** Maven演示Redis作为远程缓存、Caffeine作为本地缓存。3.1 Maven依赖 pom.xml!-- JetCache Redis Starter 核心依赖 --dependencygroupIdcom.alicp.jetcache/groupIdartifactIdjetcache-starter-redis/artifactIdversion2.7.8/version/dependency!-- Caffeine高性能本地缓存 --dependencygroupIdcom.github.benmanes.caffeine/groupIdartifactIdcaffeine/artifactIdversion2.9.3/version/dependency!-- SpringBoot Web/Mybatis 基础依赖省略 --3.2 application.yml 完整配置# JetCache全局配置jetcache:# 本地缓存配置 Caffeinelocal:default:type:caffeinelimit:2000# 本地缓存最大存储key数量keyConvertor:fastjson2# 远程Redis缓存配置remote:default:type:redishost:127.0.0.1port:6379database:0#password: 你的redis密码poolConfig:maxTotal:60maxIdle:20minIdle:5keyConvertor:fastjson2valueEncoder:javavalueDecoder:javastatIntervalMinutes:1# 缓存统计日志打印间隔3.3 启动类开启JetCache注解必须添加两个核心注解否则缓存注解失效importcom.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;importcom.alicp.jetcache.anno.config.EnableMethodCache;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication// 开启CreateCache编程式缓存EnableCreateCacheAnnotation// 开启方法注解缓存扫描业务包EnableMethodCache(basePackagescom.jetcache.demo)publicclassJetCacheDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(JetCacheDemoApplication.class,args);}}3.4 Redis启动shell命令# 本地启动redis服务redis-server /usr/local/redis/redis.conf# 客户端连接redis验证redis-cli-h127.0.0.1-p6379# 查看缓存key是否生成keys *四、实战案例用户多级缓存完整开发 分两大方案注解式缓存业务首选、编程式Cache API复杂场景附带CRUD完整代码解决缓存穿透、击穿、雪崩。4.1 实体类 UserDOimportlombok.Data;importjava.io.Serializable;DatapublicclassUserDOimplementsSerializable{privateLonguserId;privateStringusername;privateIntegerage;}4.2 方案1注解式缓存Cached/CacheUpdate/CacheInvalidateUserService 业务接口importcom.alicp.jetcache.anno.CacheInvalidate;importcom.alicp.jetcache.anno.CacheUpdate;importcom.alicp.jetcache.anno.Cached;importcom.alicp.jetcache.anno.CacheType;importcom.jetcache.demo.entity.UserDO;publicinterfaceUserService{/** * 查询用户多级缓存 BOTH本地Redis * cacheNullValuetrue 缓存空值防缓存穿透 * expire3600 缓存1小时 */Cached(nameuser:info:,key#userId,cacheTypeCacheType.BOTH,localLimit1000,expire3600,cacheNullValuetrue)UserDOgetUserById(LonguserId);/** * 更新用户同步更新本地远程缓存 */CacheUpdate(nameuser:info:,key#user.userId,value#user)voidupdateUser(UserDOuser);/** * 删除用户清理两级缓存 */CacheInvalidate(nameuser:info:,key#userId)voiddeleteUser(LonguserId);}UserServiceImpl 实现类模拟DB查询importcom.jetcache.demo.entity.UserDO;importcom.jetcache.demo.service.UserService;importorg.springframework.stereotype.Service;ServicepublicclassUserServiceImplimplementsUserService{OverridepublicUserDOgetUserById(LonguserId){// 模拟数据库查询逻辑System.out.println(查询数据库 userId userId);if(userId1001L){UserDOusernewUserDO();user.setUserId(1001L);user.setUsername(JetCache测试用户);user.setAge(24);returnuser;}// 不存在返回null由cacheNullValue缓存空值returnnull;}OverridepublicvoidupdateUser(UserDOuser){// 模拟更新数据库System.out.println(更新数据库用户user);}OverridepublicvoiddeleteUser(LonguserId){// 模拟删除数据库System.out.println(删除数据库用户 userIduserId);}}4.3 方案2编程式缓存 CreateCache 复杂场景适合动态控制缓存、批量操作场景类似Map操作importcom.alicp.jetcache.Cache;importcom.alicp.jetcache.anno.CreateCache;importcom.alicp.jetcache.anno.CacheType;importcom.jetcache.demo.entity.UserDO;importorg.springframework.stereotype.Component;importjava.util.concurrent.TimeUnit;ComponentpublicclassUserCacheManager{// 定义两级缓存实例过期2小时CreateCache(nameuser:create:,cacheTypeCacheType.BOTH,expire7200,timeUnitTimeUnit.SECONDS)privateCacheLong,UserDOuserCache;// 存入缓存publicvoidsetUser(UserDOuser){userCache.put(user.getUserId(),user);}// 查询缓存publicUserDOgetUser(LonguserId){returnuserCache.get(userId);}// 删除缓存publicvoidremoveUser(LonguserId){userCache.remove(userId);}}4.4 缓存三大问题解决方案实战4.4.1 缓存穿透大量请求查不存在key方案cacheNullValuetrue注解自带空数据存入缓存设置短过期时间无需手动编码。Cached(nameuser:,key#id,cacheNullValuetrue)4.4.2 缓存击穿热点key过期并发查DB方案开启分布式锁 自动刷新**CacheRefresh**Cached(namehot:goods:,key#goodsId,expire3600,cacheRefreshCacheRefresh(refresh1800,stopRefreshAfterLastAccess3600))4.4.3 缓存雪崩大批量key同时过期方案过期时间随机偏移注解支持**timeUnit**动态调整业务代码叠加随机值。4.5 测试Controllerimportcom.jetcache.demo.entity.UserDO;importcom.jetcache.demo.service.UserService;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;RestControllerRequestMapping(/user)publicclassUserController{ResourceprivateUserServiceuserService;GetMapping(/get)publicUserDOgetUser(RequestParamLonguserId){returnuserService.getUserById(userId);}PostMapping(/update)publicStringupdate(RequestBodyUserDOuser){userService.updateUser(user);return更新成功;}GetMapping(/delete)publicStringdelete(RequestParamLonguserId){userService.deleteUser(userId);return删除成功;}}五、总结 ✨5.1 JetCache核心优势多级缓存开箱即用一行注解开启本地内存分布式Redis大幅降低远程缓存请求量性能碾压单纯Redis缓存。注解极简开发Cached/CacheUpdate/CacheInvalidate无侵入业务统一管理缓存CRUD。原生缓存防护机制内置空值缓存、定时自动刷新一站式解决穿透、击穿、雪崩三大缓存难题。统一抽象层切换本地缓存Caffeine/LinkedHashMap、远程缓存Redis/Tair仅改配置业务代码零改动。5.2 生产环境最佳实践读多写少热点数据统一使用**CacheType.BOTH**多级缓存分布式共享数据token、订单仅使用**CacheType.REMOTE**热点商品配置**CacheRefresh**定时刷新避免缓存击穿全局开启**cacheNullValuetrue**拦截恶意穿透请求线上开启缓存统计日志监控缓存命中率优化业务。5.3 适用业务场景电商商品缓存、用户基础信息、配置类数据、首页热点列表、后台字典数据等读多写少高并发场景。