Java博文
JAVA 21 都体验了吧
Java程序员必备的Intellij插件(长期更新,截止到2018-05-03) - 掘金
32.6k star🔥原来国内的独立开发者都在做这些事情
工作六年,我学会了用 Arthas 来辅助我的日常工作
太方便了!Arthas,生产问题大杀器 - 掘金
新一代Java高性能构建工具Maven-mvnd【实践可行版】
怎么在业务团队写好发消息的代码?
Intellij 开源热加载插件 HotSwapHelper 发布,兼容若依、jeecg 等框架
SpringBoot多环境日志配置_Java_快乐非自愿限量之名_InfoQ写作社区
VSCode配置JAVA开发环境_Java_IT蜗壳-Tango_InfoQ写作社区
Java虚拟线程探究与性能解析
Jakarta EE 11 发布,增强企业 Java 开发人员生产力和性能
重要:Java25正式发布(长期支持版)!
Access Token + Refresh Token 全解析:前后端分离架构的认证与安全方案
设计一个支持千万级用户的 IM 系统:消息推送如何保证可靠性
Spring Boot + CRaC 启动速度提升了10倍!
Java 25 新特性 更简洁、更高效、更现代
玩转 Java8 Stream,让你代码更高效紧凑简洁文章目录前言一、Stream特性二、Stream创建2.1用集合创 - 掘金
Guava 简介:让 Java 开发更高效
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
一个Java工程师的17个日常效率工具
Quarkus:轻量级 Java 的未来?
OpenJDK、Temurin、GraalVM...到底该装哪个?
Lombok坑哭了!若依框架一行@Data炸出Param为null,我卡了一下午才发现BaseEntity的猫腻
缓存性能王者,阿里巴巴二级缓存JetCache框架
MapStruct使用反思与简单易用性封装
Dockerfile 构建 Java 应用瘦身优化
还在手动搭Maven多模块?这款IDEA插件让我效率提升10倍(真实体验)
本文档使用 MrDoc 发布
-
+
缓存性能王者,阿里巴巴二级缓存JetCache框架
> 关注我的公众号:【编程朝花夕拾】,可获取首发内容。  ## 01 引言 上一节介绍了本地缓存相关的使用以及坑点,本地缓存的使用往往带有局限性,用的更多的依然还是类似`Redis`这样的分布式缓存。 阿里巴巴出品的`JetCache`正是整合了本地缓存和分布式缓存,由框架自动管理本地缓存和远程缓存。提供了注解驱动的声明是缓存,同时也提供缓存的管理器`CacheManage`,可以随时手工接管缓存的使用。 我们一起来了解一下吧! ## 02 JetCache简介 `JetCache` 是一个 `Java` 缓存抽象框架,为不同缓存解决方案提供统一使用方式,其注解功能比 Spring Cache 更强大。它支持原生 TTL、两级缓存、分布式环境下自动刷新,还能通过代码操作缓存实例。 当前有 `RedisCache`、`TairCache`(未开源)、`CaffeineCache` 和 `LinkedHashMapCache` 四种实现。其具备多种特性,如通过统一缓存 `API` 操作缓存、支持带 `TTL` 和两级缓存的注解式方法缓存、可创建及配置缓存实例、自动收集缓存访问统计信息、自定义键生成和值序列化策略、支持多种缓存键和值转换器、分布式缓存自动刷新和分布式锁、异步访问、更新后使本地缓存失效以及 `Spring Boot`支持等。 环境要求: - JDK1.8 - Spring Framework4.0.8+ (optional, with annotation support),jetcache 2.7 need 5.2.4+ - Spring Boot 1.1.9+ (optional), jetcache 2.7 need 2.2.5+ `Github`地址:[github.com/alibaba/jet…](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Falibaba%2Fjetcache) ## 03 使用案例 ### 3.1 Maven 案例基于`Spring Boot 2.6.13` ```xml <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.3</version> </dependency> ``` `jetcache-starter-redis`默认使用的是`Jedis`客户端。因为`jetcache-starter-redis 2.7.8`和`Spring Boot 2.6.13`有冲突,需要引入`Jedis 4.x`版本。  否则就是出现部分类找不到的现象:  ### 3.2 配置文件 ```properties jetcache.statIntervalMinutes=15 jetcache.areaInCacheName=false #还可以选caffeine jetcache.local.default.type=linkedhashmap #还可以选fastjson/fastjson2 jetcache.local.default.keyConvertor=jackson jetcache.local.default.limit=100 jetcache.remote.default.type=redis #还可以选fastjson/fastjson2 jetcache.remote.default.keyConvertor=jackson #还可以选kryo/kryo5 jetcache.remote.default.valueEncoder=java #还可以选kryo/kryo5 jetcache.remote.default.valueDecoder=java jetcache.remote.default.poolConfig.minIdle=5 jetcache.remote.default.poolConfig.maxIdle=20 jetcache.remote.default.poolConfig.maxTotal=50 # 集群配置 jetcache.remote.default.cluster[0]=127.0.0.1:7000 jetcache.remote.default.cluster[1]=127.0.0.1:7001 jetcache.remote.default.cluster[2]=127.0.0.1:7002 ``` `JetCache`的配置并没有提示,所以配置的时候要注意,防止配错。 详细的配置说明:[github.com/alibaba/jet…](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Falibaba%2Fjetcache%2Fblob%2Fmaster%2Fdocs%2FCN%2FConfig.md) **启动类的注解** `@EnableMethodCache(basePackages = "xx.xx.xx")` ### 3.3 注解使用案例 注解可以加在接口上,也可以加在类上。案例以在类上使用为例。 常用注解: - `@Cached` - `@CacheUpdate` - `@CacheInvalidate` - `@CacheRefresh` **`@Cached` 和 `@CacheRefresh`** ```java public String test01(String userId) { System.out.println(LocalDateTime.now().format(FORMAT) + " userId=" + userId); return "test01" + Instant.now().toEpochMilli(); } ``` 代码注意事项: - `CacheType.BOTH`表示同时使用本地缓存和远程缓存,这里可以指定任意一个缓存使用。 - 属性中`name`和`key`的拼接组成`Redis`中的`key` - `key`使用的是`EL`表达式,通过`#`取属性的值 - `@CacheRefresh`的`refresh`指每隔多长时间刷新一次缓存 **缓存更新效果**  **再次请求缓存已经更新**  **`@CacheUpdate`** ```java public String test03(String userId, String val) { return "缓存更新成功!"; } ``` 这里要说明的更新的`value`的值也是通过`EL`表达式从参数中获取的,无法指定方法中的数据作为缓存的结果 **`@CacheInvalidate`** ```java public String test04(String userId) { return "缓存失效!"; } ``` ~这里值得注意的是,这里的缓存失效,会将远程的缓存失效以及本机的缓存失效,其他节点的本地缓存并不能同步失效。~ 本地缓存可以同步失效,需要配置广播通道`broadcastChannel`以及`@Cached`开启`syncLocal = true`属性。 ### 3.4 手动API接管 ```java CacheManager cacheManager; public String test02(String userId) { Cache<String, String> cacheKey = cacheManager.getCache("cache_key_"); if (cacheKey == null) { return "cache_key_ 不存在"; } if (cacheKey instanceof MultiLevelCache cache) { Cache[] caches = cache.caches(); Arrays.stream(caches).forEach(item -> { if (item instanceof LinkedHashMapCache) { System.out.println("LinkedHashMapCache:" + item.get(userId)); }else if (item instanceof RedisCache) { System.out.println("RedisCache:" + item.get(userId)); } }); } return cacheKey.get(userId); } ``` **效果**  ### 3.5 命中率统计 `JetCache`自带了统计功能,每隔一段时间就会输出统计数据。通过`jetcache.statIntervalMinutes`配置控制  ## 04 关键注意事项 因为结合本地缓存和远程缓存,那么框架就存在这两者的优势和劣势。使用的时候也需要注意: - 缓存防止大`Key`的出现 - 本地缓存需要增加容量限制 - 结合TTL和主动失效 - 多节点本地缓存不同步的问题 - 使用时`Spring Boot`、`Jedis`、`JetCache`版本兼容问题 ## 05 小结 通过合理利用`JetCache`的同步机制和缓存策略,可显著提升系统性能并保障数据一致性。建议结合具体业务场景进行参数调优,并持续监控缓存健康度。 使用任何一个框架,我们也要考虑可能带来的问题。线下发现不了,线上就会教会我们了。
admin
2025年10月5日 10:20
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码