1.依赖
<!--springBoot 缓存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.启功类加注解
@EnableCaching
3.简单使用方式
3 .1方法有参数用SpEL表达式获取
@Cacheable 缓存数据
- cacheNames/value:指定缓存组件的名字,数组形式
- key:缓存数据使用的key,确定缓存可以用唯一key进行指定;eg:编写SpEL; #id,参数id的值 ,,#a0(第一个参数), #p0(和a0的一样的意义) ,#root.args[0]
- keyGenerator:key的生成器;可以自己指定key的生成器的组件id(注意: key/keyGenerator:二选一使用;不能同时使用)
- cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器
- condition:指定符合条件的情况下才缓存;使用SpEl表达式,eg:condition = “#a0>1”:第一个参数的值>1的时候才进行缓存
- unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;eg:unless = “#a0!=2”:如果第一个参数的值不是2,结果不缓存;
- sync:是否使用异步模式
@Cacheable(value = "tree",key = "#id")
public List<Tree> getDateById(Integer id) {
System.out.println("查db");
List<Tree> trees = baseMapper.getTreeList();
return trees;
}
注意
@Cacheable是基于Spring AOP代理类,内部方法调用是不走代理的,@Cacheable是不起作用的
加@CacheEvict的方法可以在同一个类中进行调用,缓存会进行清空
如果方法内部调用需要使用spring容器中的bean来调用,
方法1:将缓存的方法单独放一个类里,与调用的方法分开,不放在同一个类里。避免同一个类调用
方法2:使用autowired获取当前类的bean
调用
@Cacheable(value = "basic",key = "'data'")
public BranchBasic getAll() {
System.out.println(">>查db");
BranchBasic branchBasic = getById(orgId);
return branchBasic;
}
@CachePut 调用方法并将返回值更新缓存
@CachePut 与 @Cacheable 的属性基本相同
不同点:
@Cacheable:先查缓存,有缓存返回,无缓存查DB
@CachePut :先执行,然后将执行的结果缓存起来
@CachePut(value = "branchBasic",key = "#branchBasic.orgId")
public BranchBasic updateData(BranchBasic branchBasic) {
updateById(branchBasic);
System.out.println(">>修改成功");
return branchBasic;
}
@CacheEvict 清空缓存
key:指定要清除的数据
allEntries = true:指定清除这个缓存中所有的数据
beforeInvocation = false:默认代表缓存清除操作是在方法执行之后执行
beforeInvocation = true:代表清除缓存操作是在方法运行之前执行
@CacheEvict(value = "branchBasic",key = "orgId")
public void delData(int orgId) {
System.out.println("清空此orgId缓存");
}
3.2方法无参数的情况
给key取名称,加单引号
@Cacheable(value = "branchBasic",key = "'allData'")
public BranchBasic getDateById() {
System.out.println(">>查db");
BranchBasic branchBasic = getById(orgId);
return branchBasic;
}