一、背景描述
今天来介绍一下由 alibaba 开源的一款缓存框架 jetcache。其号称比 spring cache 用起来更加好用,在我使用之后发现确实比较好用,步骤也非常简单。
jetcache 是一个基于java 的缓存系统封装,提供统一的api和注解来简化缓存的使用。 jetcache 提供了比 springcache 更加强大的注解,可以原生的支持 ttl、两级缓存、分布式自动刷新,还提供了 cache 接口用于手工缓存操作。 当前有四个实现,rediscache、taircache(此部分未在github开源)、caffeinecache(in memory)和一个简易的linkedhashmapcache(in memory),要添加新的实现也是非常简单的。
二、jetcache特点与要求
2.1 jetcache的特点
以下简单描述一下jetcache的特点,方便在使用之前做些简单的了解:
- 通过一致的 cache api 操作缓存。
- 在方法上面使用注解,就可以实现 ttl 和两级缓存。
- 使用注释创建和配置 cache 实例。
- 自动收集 cache 实例和方法缓存的访问统计信息。
- key 生成和 value 序列化的策略可以定制。
- 分布式缓存自动刷新和分布式锁定。(2.2)
- 使用 cache api 进行异步访问。(2.2版本以上,redis客户端)
- 支持 spring boot。
2.2 jetcache的要求
- jetcache需要jdk1.8、spring framework4.0.8以上版本。
- spring boot为可选,需要1.1.9以上版本。
- 如果不使用注解(仅使用jetcache-core),spring framework也是可选的,此时使用方式与guava/caffeine cache类似。
三、使用步骤
以下案例分别为使用 spring boot 的项目,另外一个是未使用 spring boot 的项目:
3.1 spring boot 项目
使用步骤以 spring boot 项目为例:
3.1.1 引入依赖
现在目前最新的版本是 2.7.0.m1,以后还会继续更新,如果想使用最新版本的可以去 maven 的中央仓库下载哈
<!-- jet cache-->
<dependency>
<groupid>com.alicp.jetcache</groupid>
<artifactid>jetcache-starter-redis</artifactid>
<version>2.7.0.m1</version>
</dependency>3.1.2 application.yml配置
先来张图记录一下配置,当然也可以直接从图下面的配置里粘贴,哈哈

如果想直接复制粘贴的话,从下面的文本框中 cv 一下(记得修改redis的地址和用户名密码哈)即可。
jetcache:
statintervalminutes: 15
areaincachename: false
local:
default:
type: linkedhashmap
keyconvertor: fastjson
limit: 1000
remote:
default:
type: redis
keyconvertor: fastjson
valueencoder: java
valuedecoder: java
poolconfig:
minidle: 5
maxidle: 20
maxtotal: 50
database: 16 # 连接工厂使用的数据库索引
host: xxx # 此处需要修改哈
port: xxx # 此处需要修改哈
password: xxx # 此处需要修改哈3.1.3 启动类注解
@enablemethodcache(basepackages = "com.iot.back.message")

3.1.4 方法上添加注解
expire表示返回值user对象,将在3600秒后过期,jetcache默认使用所有入参生成缓存的key。

3.2 未使用 spring boot 的项目
以下是未使用 springboot 的配置方式,如果没有使用spring boot,可以按下面的方式配置(这里使用jedis客户端连接redis为例)。
3.2.1 引入依赖
<dependency>
<groupid>com.alicp.jetcache</groupid>
<artifactid>jetcache-anno</artifactid>
<version>2.6.4</version>
</dependency>
<dependency>
<groupid>com.alicp.jetcache</groupid>
<artifactid>jetcache-redis</artifactid>
<version>2.6.4</version>
</dependency>3.2.2 编写配置类
配置了这个jetcacheconfig类以后,可以使用@createcache和@cached注解。
package com.company.mypackage;
import java.util.hashmap;
import java.util.map;
import com.alicp.jetcache.anno.cacheconsts;
import com.alicp.jetcache.anno.config.enablecreatecacheannotation;
import com.alicp.jetcache.anno.config.enablemethodcache;
import com.alicp.jetcache.anno.support.globalcacheconfig;
import com.alicp.jetcache.anno.support.springconfigprovider;
import com.alicp.jetcache.embedded.embeddedcachebuilder;
import com.alicp.jetcache.embedded.linkedhashmapcachebuilder;
import com.alicp.jetcache.redis.rediscachebuilder;
import com.alicp.jetcache.support.fastjsonkeyconvertor;
import com.alicp.jetcache.support.javavaluedecoder;
import com.alicp.jetcache.support.javavalueencoder;
import org.apache.commons.pool2.impl.genericobjectpoolconfig;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import redis.clients.jedis.jedis;
import redis.clients.jedis.jedispool;
import redis.clients.util.pool;
@configuration
@enablemethodcache(basepackages = "com.company.mypackage")
@enablecreatecacheannotation
public class jetcacheconfig {
@bean
public pool<jedis> pool(){
genericobjectpoolconfig pc = new genericobjectpoolconfig();
pc.setminidle(2);
pc.setmaxidle(10);
pc.setmaxtotal(10);
return new jedispool(pc, "localhost", 6379);
}
@bean
public springconfigprovider springconfigprovider() {
return new springconfigprovider();
}
@bean
public globalcacheconfig config(pool<jedis> pool){
// public globalcacheconfig config(springconfigprovider configprovider, pool<jedis> pool){ // for jetcache 2.5
map localbuilders = new hashmap();
embeddedcachebuilder localbuilder = linkedhashmapcachebuilder
.createlinkedhashmapcachebuilder()
.keyconvertor(fastjsonkeyconvertor.instance);
localbuilders.put(cacheconsts.default_area, localbuilder);
map remotebuilders = new hashmap();
rediscachebuilder remotecachebuilder = rediscachebuilder.createrediscachebuilder()
.keyconvertor(fastjsonkeyconvertor.instance)
.valueencoder(javavalueencoder.instance)
.valuedecoder(javavaluedecoder.instance)
.jedispool(pool);
remotebuilders.put(cacheconsts.default_area, remotecachebuilder);
globalcacheconfig globalcacheconfig = new globalcacheconfig();
// globalcacheconfig.setconfigprovider(configprovider); // for jetcache 2.5
globalcacheconfig.setlocalcachebuilders(localbuilders);
globalcacheconfig.setremotecachebuilders(remotebuilders);
globalcacheconfig.setstatintervalminutes(15);
globalcacheconfig.setareaincachename(false);
return globalcacheconfig;
}
}
3.3 属性表
关于配置文件和注解里的每个字段含义详情请移步另一篇文章,特别详细的说明解释jetcache的配置说明和注解属性说明
@cached注解和@createcache的属性非常类似,但是多几个:
| 属性 | 默认值 | 说明 |
|---|---|---|
| area | “default” | 如果在配置中配置了多个缓存area,在这里指定使用哪个area |
| name | 未定义 | 指定缓存的唯一名称,不是必须的,如果没有指定,会使用类名+方法名。name会被用于远程缓存的key前缀。另外在统计中,一个简短有意义的名字会提高可读性。 |
| key | 未定义 | 使用spel指定key,如果没有指定会根据所有参数自动生成。 |
| expire | 未定义 | 超时时间。如果注解上没有定义,会使用全局配置,如果此时全局配置也没有定义,则为无穷大 |
| timeunit | timeunit.seconds | 指定expire的单位 |
| cachetype | cachetype.remote | 缓存的类型,包括cachetype.remote、cachetype.local、cachetype.both。如果定义为both,会使用local和remote组合成两级缓存 |
| locallimit | 未定义 | 如果cachetype为local或both,这个参数指定本地缓存的最大元素数量,以控制内存占用。如果注解上没有定义,会使用全局配置,如果此时全局配置也没有定义,则为100 |
| localexpire | 未定义 | 仅当cachetype为both时适用,为内存中的cache指定一个不一样的超时时间,通常应该小于expire |
| serialpolicy | 未定义 | 指定远程缓存的序列化方式。可选值为serialpolicy.java和serialpolicy.kryo。如果注解上没有定义,会使用全局配置,如果此时全局配置也没有定义,则为serialpolicy.java |
| keyconvertor | 未定义 | 指定key的转换方式,用于将复杂的key类型转换为缓存实现可以接受的类型,当前支持keyconvertor.fastjson和keyconvertor.none。none表示不转换,fastjson可以将复杂对象key转换成string。如果注解上没有定义,会使用全局配置。 |
| enabled | true | 是否激活缓存。例如某个dao方法上加缓存注解,由于某些调用场景下不能有缓存,所以可以设置enabled为false,正常调用不会使用缓存,在需要的地方可使用cachecontext.enablecache在回调中激活缓存,缓存激活的标记在threadlocal上,该标记被设置后,所有enable=false的缓存都被激活 |
| cachenullvalue | false | 当方法返回值为null的时候是否要缓存 |
| condition | 未定义 | 使用spel指定条件,如果表达式返回true的时候才去缓存中查询 |
| postcondition | 未定义 | 使用spel指定条件,如果表达式返回true的时候才更新缓存,该评估在方法执行后进行,因此可以访问到#result |
四、依赖哪个jar?
- jetcache-anno-api:定义jetcache的注解和常量,不传递依赖。如果你想把cached注解加到接口上,又不希望你的接口jar传递太多依赖,可以让接口jar依赖jetcache-anno-api。
- jetcache-core:核心api,完全通过编程来配置操作cache,不依赖spring。两个内存中的缓存实现linkedhashmapcache和caffeinecache也由它提供。
- jetcache-anno:基于spring提供@cached和@createcache注解支持。
- jetcache-redis:使用jedis提供redis支持。
- jetcache-redis-lettuce(需要jetcache2.3以上版本):使用lettuce提供redis支持,实现了jetcache异步访问缓存的的接口。
- jetcache-starter-redis:spring boot方式的starter,基于jedis。
- jetcache-starter-redis-lettuce(需要jetcache2.3以上版本):spring boot方式的starter,基于lettuce。
参考文档:《jetcache官方文档》
到此这篇关于springboot中jetcache的使用方法小结的文章就介绍到这了,更多相关springboot jetcache使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论