阿里开源的缓存框架JetCache,实现spring二级缓存
之前一直在用Spring Cache进行接口数据的缓存,主要是Spring Cache在对具体key缓存失效时间的设置不是很方法,还要自己去扩展,无意中发现了阿里的JetCache。大部分的需求都能满足,并且有一些很实用的功能,今天给大家介绍下。
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
GitHub:https://github.com/alibaba/jetcache
简介
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache
接口用于手工缓存操作。 当前有四个实现,RedisCache
、TairCache
(此部分未在github开源)、CaffeineCache
(in memory)和一个简易的LinkedHashMapCache
(in memory),要添加新的实现也是非常简单的。
全部特性:
- 通过统一的API访问Cache系统
- 通过注解实现声明式的方法缓存,支持TTL和两级缓存
- 通过注解创建并配置
Cache
实例 - 针对所有
Cache
实例和方法缓存的自动统计 - Key的生成策略和Value的序列化策略是可以配置的
- 分布式缓存自动刷新,分布式锁 (2.2+)
- 异步Cache API (2.2+,使用Redis的lettuce客户端时)
- Spring Boot支持
要求
JetCache需要JDK1.8、Spring Framework4.0.8以上版本。Spring Boot为可选,需要1.1.9以上版本。如果不使用注解(仅使用jetcache-core),Spring Framework也是可选的,此时使用方式与Guava/Caffeine cache类似。
文档目录
- 快速入门
- 基本Cache API
- 通过@CreateCache注解创建
Cache
实例 - 通过注解实现方法缓存
- 配置详解
- 高级Cache API
- Redis支持(两种redis客户端二选一即可)
- 使用jedis客户端连接redis
- 使用lettuce客户端连接redis
- 内存缓存
LinkedHashMapCache
和CaffeineCache
- 统计
- Builder:未使用Spring4(或未使用Spring)的时候,或通过Builder手工构造
Cache
- 开发者文档
- 升级和兼容性指南
- FAQ
基本配置(使用Spring Boot)
如果使用Spring Boot,可以按如下的方式配置(这里使用了jedis客户端连接redis,如果需要集群、读写分离、异步等特性支持请使用lettuce客户端)。
增加Maven配置:
<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.5.14</version>
</dependency>
配置说明
jetcache:statIntervalMinutes: 15areaInCacheName: falsehidePackages: com.alibabalocal:default:type: caffeinelimit: 100keyConvertor: fastjsonexpireAfterWriteInMillis: 100000otherArea:type: linkedhashmaplimit: 100keyConvertor: noneexpireAfterWriteInMillis: 100000remote:default:type: rediskeyConvertor: fastjsonvalueEncoder: javavalueDecoder: javapoolConfig:minIdle: 5maxIdle: 20maxTotal: 50host: ${redis.host}port: ${redis.port}otherArea:type: rediskeyConvertor: fastjsonvalueEncoder: kryovalueDecoder: kryopoolConfig:minIdle: 5maxIdle: 20maxTotal: 50host: ${redis.host}port: ${redis.port}
配置通用说明如下
属性 | 默认值 | 说明 |
---|---|---|
jetcache.statIntervalMinutes | 0 | 统计间隔,0表示不统计 |
jetcache.areaInCacheName | true | jetcache-anno把cacheName作为远程缓存key前缀,2.4.3以前的版本总是把areaName加在cacheName中,因此areaName也出现在key前缀中。2.4.4以后可以配置,为了保持远程key兼容默认值为true,但是新项目的话false更合理些。 |
jetcache.hiddenPackages | 无 | @Cached和@CreateCache自动生成name的时候,为了不让name太长,hiddenPackages指定的包名前缀被截掉 |
jetcache.[local|remote].${area}.type | 无 | 缓存类型。tair、redis为当前支持的远程缓存;linkedhashmap、caffeine为当前支持的本地缓存类型 |
jetcache.[local|remote].${area}.keyConvertor | 无 |
key转换器的全局配置,当前只有一个已经实现的keyConvertor:fastjson 。仅当使用@CreateCache且缓存类型为LOCAL时可以指定为none ,此时通过equals方法来识别key。方法缓存必须指定keyConvertor
|
jetcache.[local|remote].${area}.valueEncoder | java | 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo |
jetcache.[local|remote].${area}.valueDecoder | java | 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo |
jetcache.[local|remote].${area}.limit | 100 | 每个缓存实例的最大元素的全局配置,仅local类型的缓存需要指定。注意是每个缓存实例的限制,而不是全部,比如这里指定100,然后用@CreateCache创建了两个缓存实例(并且注解上没有设置localLimit属性),那么每个缓存实例的限制都是100 |
jetcache.[local|remote].${area}.expireAfterWriteInMillis | 无穷大 | 以毫秒为单位指定超时时间的全局配置(以前为defaultExpireInMillis) |
jetcache.local.${area}.expireAfterAccessInMillis | 0 | 需要jetcache2.2以上,以毫秒为单位,指定多长时间没有访问,就让缓存失效,当前只有本地缓存支持。0表示不使用这个功能。 |
上表中${area}对应@Cached和@CreateCache的area属性。注意如果注解上没有指定area,默认值是"default"。
关于缓存的超时时间,有多个地方指定,澄清说明一下:
- put等方法上指定了超时时间,则以此时间为准
- put等方法上未指定超时时间,使用Cache实例的默认超时时间
- Cache实例的默认超时时间,通过在@CreateCache和@Cached上的expire属性指定,如果没有指定,使用yml中定义的全局配置,例如@Cached(cacheType=local)使用jetcache.local.default.expireAfterWriteInMillis,如果仍未指定则是无穷大
启动类开启缓存:
@SpringBootApplication
@EnableMethodCache(basePackages = "com.cxytiandi.jetcache")
@EnableCreateCacheAnnotation
public class App {public static void main(String[] args) {SpringApplication.run(App.class);}
}
- @EnableMethodCache
用于激活@Cached注解的使用 - @EnableCreateCacheAnnotation
用于激活@CreateCache注解的使用
定义一个简单的实体类来作为数据的缓存,必须实现Serializable接口。
@Data
public class User implements Serializable {private Long id;private String name;}
@CreateCache使用
@CreateCache(expire = 100)
private Cache<Long, User> userCache;User user = new User();
user.setId(1L);
user.setName("yinjihuan");
// 新增缓存
userCache.put(1L, user);// 删除缓存
userCache.remove(1L);
用起来很简单,就像操作本地Map一样,@CreateCache中有很多配置需要我们自己去指定,不指定则使用默认的,关于配置请查看文档:https://github.com/alibaba/jetcache/wiki/CreateCache_CN
@Cached使用
@Cached(name="getUser.", key="#id", expire = 8, cacheType=CacheType.BOTH)
@Override
public User getUser(Long id) {User user = new User();user.setId(1L);user.setName("yinjihuan");return user;
}
- name
缓存名称 - key
缓存key,追加到name后面构成唯一的缓存key, 使用SpEL指定key,如果没有指定会根据所有参数自动生成。 - expire
缓存失效时间 - cacheType
缓存的类型,包括CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。如果定义为BOTH,会使用LOCAL和REMOTE组合成两级缓存
更多配置的介绍请查看文档:https://github.com/alibaba/jetcache/wiki/MethodCache_CN
今天的介绍就到这里,使用起来还是很方便的,关于更多的功能大家自行去尝试吧,比如缓存定时刷新,缓存命中率统计,自定义序列化方式等等。
@Cached定义在接口上的坑
还有一个呢就是@Cached如果定义在接口上就不能指定key属性,框架中会自动根据参数生成key, 如果非得自己用SPEL表达式指定key的话,项目编译设置target必须为1.8格式,并且指定javac的-parameters参数,否则就要使用key="args[0]"这样按下标访问的形式。我建议还是把@Cached的定义放在实现类上,也方便修改。
阿里开源的缓存框架JetCache,实现spring二级缓存相关推荐
- SpringBoot整合缓存框架(jetcache、memcached、mykit-cache)
目录 1.缓存简介 2.应用场景 3.memcache 4.jetcache 4.1 jetcache简介 4.1.2 引入依赖 4.1.3 jetcacje配置 4.1.4 测试项目结构 4.1.5 ...
- Spring二级缓存
1.注解方式开启Spring二级缓存 1.1主启动类 `@EnableCaching` 1.2 需要加注解的方法 在serviceimpl层加 查询:@Cacheable(value="us ...
- jedis使用_Mybatis的二级缓存、使用Redis做二级缓存
什么是二级缓存? 二级缓存和一级缓存的原理是一样的,第一次查询,会将数据放入缓存中,然后第二次查询则会直接去缓存中取.但是一级缓存是基于的sqlSession,而二级缓存是基于mapper文件的nam ...
- 阿里巴巴开源的缓存框架JetCache创建缓存
官网:https://github.com/alibaba/jetcache/wiki/CacheAPI_CN ======================= 多层嵌套缓存无效的问题: https:/ ...
- 阿里开源深度学习框架XDL,面向高维稀疏数据,支持千亿参数训练规模
安妮 发自 阿里中心 量子位 出品 | 公众号 QbitAI 近日,阿里巴巴首次开源了面向高维稀疏数据的深度学习框架,叫作X-Deep Learning,简称XDL. 阿里表示,XDL基于大数据营销平 ...
- Java缓存学习之五:spring 对缓存的支持
(注意标题,Spring对缓存的支持 这里不单单指Ehcache ) 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache ...
- 计算机cpu 二级缓存,Windowsxp系统开启cpu二级缓存的两种方法
WindowsXP系统的CPU二级缓存在默认情况下是处于关闭状态的.一些用户为了发挥出CPU的最大效率,就希望能打开CPU二级缓存.这该如何操作呢?接下来,系统城小编就为大家详细介绍xp系统cpu打开 ...
- 第二代NumPy?阿里开源超大规模矩阵计算框架Mars
机器之心 2018-12-26 13:41:47 选自 GitHub,机器之心编译,参与:刘晓坤. Mars 是由阿里云高级软件工程师秦续业等人开发的一个基于张量的大规模数据计算的统一框架,目前它已在 ...
- 详解阿里开源分布式事务框架Seata
Seata发展历史 笔者于2014年开始着手解决阿里巴巴集团内部业务的分布式事务问题,从0到1研发一个支持非侵入模式(内部称之为AT模式,即自动模式)和TCC模式(内部称之为MT模式,即手动模式)的分 ...
最新文章
- kafka异步推送设置重试_一篇文章了解 Kafka 幂等性的原理及实践
- vba 编辑combobox内容_初识Visual Basic编辑器并建立一段简单的代码
- 山西农信社计算机知识,山西人事考试网 山西农信社考试计算机知识高频考点(二)...
- 彩云小译怎么翻译网页_谷歌、百度、有道做不到的,统统交给这5款翻译工具!...
- [转] Ghost自动安装
- SQL Server 大数据搬迁之文件组备份还原实战
- 对dropout的理解详细版
- iOS UITextField使用全攻略
- javascript时间戳和日期字符串相互转换代码
- mysql存储过程并行_Mysql存储过程的执行顺序问题
- WEB安全基础-URL跳转漏洞
- 安卓权威编程指南 挑战练习 20.9 创建多版本主题
- Tomcat Maven插件分环境运行配置
- 《STM32》F103C8T6最小系统
- 陈吉平的Oracle职业生涯:兴趣与思考 成败之所系
- Python爬虫之QQ空间登陆获取信息!
- 信号完整性和电源完整性基本介绍
- 2021年场(厂)内专用机动车辆安全管理考试及场(厂)内专用机动车辆安全管理考试题
- RHEL8红帽子系统 网卡命令
- GAN GAN Inversion
热门文章
- 单细胞转录组数据整合分析专题研讨会(2019.11)
- 被鱼刺扎一下就没了条手臂?这种“吃人肉”的细菌身边并不罕见
- Python使用matplotlib函数subplot可视化多个不同颜色的折线图、为指定的子图添加图例信息(legend)
- R语言使用randomForest包构建随机森林模型(Random forests)、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB
- R语言dataframe获取每个字段(特征)的数据类型实战:使用sapply函数获取每个字段(特征)的数据类型、通过柱状图可视化特征的种类以及个数
- R语言可视化包ggplot2绘制平滑曲线、回归线实战:geom_smooth() 函数
- R语言诊断试验数据处理与ROC分析实战案例:联合诊断ROC
- plotly可视化绘制多子图(subplots)共享坐标轴
- keras构建前馈神经网络(feedforward neural network)进行回归模型构建和学习
- angular4创建html,angular 4减少html内容