前言
为什么不使用 spring cache?
最开始使用的spring cache,但是由于springcache只支持全局的缓存过期时间设置,不支持单个设置缓存过期时间,且jetcache支持三种缓存方式LOCAL/REMOTE/BOTH 三种选择, 分别代表本地内存/远程 Cache Server(如Redis)/两级缓存。
下面以redis为存储,springboot整合jetcache。
JetCache简介
JetCache 是由阿里巴巴开源的一款通用缓存访问框架。官方文档说明JetCache 提供的核心能力包括:
- 提供统一的,类似jsr-107风格的API访问Cache,并可通过注解创建并配置Cache实例
- 通过注解实现声明式的方法缓存,支持TTL和两级缓存
- 分布式缓存自动刷新,分布式锁 (2.2+)
- 支持异步Cache API
- Spring Boot支持
- Key的生成策略和Value的序列化策略是可以定制的
- 针对所有Cache实例和方法缓存的自动统计
springboot +JetCache 使用
1、引入pom依赖
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.5.11</version>
</dependency>
2、增加jetCache的缓存配置
jetcache:
statIntervalMinutes: 15
areaInCacheName: false
local:
default:
type: linkedhashmap
keyConvertor: fastjson
otherCacheName:
type: xxx
keyConverter: yyy
remote:
default:
type: redis
keyConvertor: fastjson
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: 127.0.0.1
port: 6379
password: redis
3、 在启动类上增加注解
EnableMethodCache,EnableCreateCacheAnnotation这两个注解分别激活Cached和CreateCache注解,其他和标准的Spring Boot程序是一样的。这个类可以直接main方法运行。
@SpringBootApplication
@EnableMethodCache(basePackages = "cn.fengpt")
@EnableCreateCacheAnnotation
public class CloudServiceAuthApplication {
public static void main(String[] args) {
SpringApplication.run(CloudServiceAuthApplication.class, args);
}
}
其中需要注意的是:
- 增加注解EnableMethodCache,并制定开启缓存对应的包路径。
- 增加注解EnableCreateCacheAnnotation,这个注解是开启对应的CreateCache注解。
4、两种缓存的使用
1).自定义缓存的方式,@CreateCache注解创建一个缓存实例
JetCache中提供了@createCache的注解的支持,可以自己定义的cache,灵活性比较高,下面讲一下具体的用法
加入createCache的支持----@EnableCreateCacheAnnotation
@CreateCache(expire = 100)
private Cache<Long, UserDO> userCache;
用起来就像map一样,注意对象实现可序列化接口。
UserDO user = userCache.get(123L);
userCache.put(123L, user);
userCache.remove(123L);
创建一个两级(内存+远程)的缓存,内存中的元素个数限制在50个。
@CreateCache(name = "UserService.userCache", expire = 100, cacheType = CacheType.BOTH, localLimit = 50)
private Cache<Long, UserDO> userCache
2)创建方法缓存
实现方式是spring aop,采用注解的方式@cache
JetcacheService :
public interface JetcacheService {
@Cached(name = "sys_user_cache_", expire = 3600)
SysUserDTO getUserById(Long id);
}
JetcacheServiceImpl :
@Service
public class JetcacheServiceImpl implements JetcacheService {
@Override
public SysUserDTO getUserById(Long id) {
SysUserDTO sysUserDTO=new SysUserDTO();
sysUserDTO.setId(1L);
sysUserDTO.setUserName("A");
System.out.println("查数据库");
return sysUserDTO;
}
}
调用接口测试:
注意:
@Cached定义在接口上的坑
还有一个呢就是@Cached如果定义在接口上就不能指定key属性,框架中会自动根据参数生成key, 如果非得自己用SPEL表达式指定key的话,项目编译设置target必须为1.8格式,并且指定javac的-parameters参数,否则就要使用key="args[0]"这样按下标访问的形式
Cached参数说明:
- 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
JetCache还有一个优点不得不提,这也是在应用之后不经意之间发现的,那就是JetCache的统计报表功能
评论区