在实际应用中,并不是单一的使用本地缓存或者redis,更多是组合使用来满足不同的业务场景。
jetcache组件实现了优雅的组合本地缓存和远程缓存。
支持多种缓存类型:本地缓存、分布式缓存、多级缓存。
官网地址:https://github.com/alibaba/jetcache
官方文档:https://github.com/alibaba/jetcache/tree/master/docs/CN
一、依赖
非SpringBoot项目参考官网配置

SpringBoot依赖
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.7.0</version>
</dependency>
<!-- jetcache2.7.x版本需要额外添加该依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>

二、修改配置文件,配置redis地址和线程数
jetcache:
## 统计间隔,0表示不统计,开启后定期在控制台输出缓存信息
statIntervalMinutes: 15
## 是否把cacheName作为远程缓存key前缀
areaInCacheName: false
## 本地缓存配置
local:
default: ## default表示全部生效,也可以指定某个cacheName
## 本地缓存类型,其他可选:caffeine/linkedhashmap
type: linkedhashmap
keyConvertor: fastjson
## 远程缓存配置
remote:
default: ## default表示全部生效,也可以指定某个cacheName
type: redis
## key转换器方式n
keyConvertor: fastjson
broadcastChannel: projectA
## redis序列化方式
valueEncoder: java
valueDecoder: java
## redis线程池
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
## redis地址与端口
host: 127.0.0.1
port: 6379

三、启动类添加注解@EnableCreateCacheAnnotation开启缓存
@EnableMethodCache(basePackages = “com.example.jetcachedemo”)注解,配置缓存方法扫描路径
四、使用缓存,通过三种方式
方式一:AOP模式,通过@Cached,@CacheUpdate,@CacheInvalidate
@RestController
@RequestMapping("user")
public class UserController{
@GetMapping("getRemote")
@Cached(name="userCache:",key="#id",expire=3600,timeUnit=TimeUnit.SECONDS,cacheType = CacheType.REMOTE)
public User getRemote(Long id){
//直接新建用户,模拟从数据库获取数据
User user = new User();
user.setId(id);
user.setName("用户remote"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次获取数据,未走缓存:"+id);
return user;
}
@GetMapping("getLocal")
@Cached(name="userCache:", key = "#id", expire = 3600, timeUnit = TimeUnit.SECONDS, cacheType = CacheType.LOCAL)
public User getLocal(Long id){
// 直接新建用户,模拟从数据库获取数据
User user = new User();
user.setId(id);
user.setName("用户local"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次获取数据,未走缓存:"+id);
return user;
}
@GetMapping("getBoth")
@Cached(name="userCache:", key = "#id", expire = 3600, timeUnit = TimeUnit.SECONDS, cacheType = CacheType.BOTH)
public User getBoth(Long id){
// 直接新建用户,模拟从数据库获取数据
User user = new User();
user.setId(id);
user.setName("用户both"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次获取数据,未走缓存:"+id);
return user;
}
@PostMapping("updateUser")
@CacheUpdate(name = "userCache:", key = "#user.id", value = "#user")
public Boolean updateUser(@RequestBody User user){
// TODO 更新数据库
return true;
}
@PostMapping("deleteUser")
@CacheInvalidate(name = "userCache:", key = "#id")
public Boolean deleteUser(Long id){
// TODO 从数据库删除
return true;
}
}
实体类User一定要实现序列化,即声明Serializable
@Data
public class User implements Serializable {
private Long id;
private String name;
private Integer age;
private Integer sex;
}
访问localhost:8088/user/getRemote?id=1

因为配置的是远程缓存,在redis中也能看到对应的key

访问localhost:8088/user/getLocal?id=1,这个方法是从本地缓存获取的,现在只有远程缓存上有数据,我们调用发现缓存数据还是拿到了,这说明当我们在配置文件中配置了本地缓存和远程缓存后,方式一中本地缓存和远程缓存会自动相互调用
比如本地缓存有这个key,redis中没有,通过远程缓存方

最低0.47元/天 解锁文章
622

被折叠的 条评论
为什么被折叠?



