Spring 参考了JSR107 自己设计了一套缓存抽象。要使用缓存首先在主类上标注@EnableCaching。
@SpringBootApplication
@EnableCaching
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
01 @Cacheable
@Cacheable标注在方法上,作用是将方法返回的数据缓存起来,每次调用方法之前都先去看缓存中是否有相应的返回值,若有直接返回缓存中的数据,不调用该方法,这个注解有如下属性:
- cacheNames/value:指定将数据要缓存到哪个 Cache。
- key:指定数据在缓存中的 key,默认时方法传入的参数,该属性的值是 SpEL 表达式,#id 取出传入的 id 值。
- keyGenerator:自定义 key 的生成器,key 和 keyGenerator 只能二选一。
- condition:值是 SpEL 表达式,满足条件才缓存。
- unless:值是 SpEL 表达式,满足条件不缓存。
- sync:是否使用异步模式,默认值为 false,开启后返回的数据将以异步的形式缓存到 Cache 中。
@Service
public class EmpService {
@Autowired
private EmpMapper empMapper;
@Cacheable(value = "emp", key = "#id")
public Emp getEmp(Integer id) {
System.out.println("get emp...");
return empMapper.selectEmpById(id);
}
}
02 @CachePut
这个注解标注在方法上,它的机制是每次调用方法后将方法返回值放入缓存,一般用它来完成同步更新缓存。但要明白的是如果你采用的是动态拼接字符串的方式来更新数据,那么前端传来更新对象如果有空字段,若更新方法直接返回该对象,那么缓存的对象会和数据库不一致,它的属性和前面的大同小异。
@CachePut(value = "emp", key = "#result.empId")
public Emp updateEmp(Emp emp) {
empMapper.updateEmp(emp);
return emp;
}
03 @CacheEvict
这个注解标在方法上,它的属性和之前的大同小异,每次调用方法都会从缓存中删除数据,默认在调用方法之后删除缓存。
- allEntries:默认为 false,指定为 true 后会清空缓存中所有数据。
- beforeInvocation:默认为 false,指定为 true 后会在调用方法之前删除缓存。
@CacheEvict(value = "emp", key = "#id")
public void removeEmp(Integer id) {
System.out.println("已删除...");
}
04 @Caching
这个注解标注在方法上,用于复杂的缓存规则,其属性如下:
public @interface Caching {
Cacheable[] cacheable() default {};
CachePut[] put() default {};
CacheEvict[] evict() default {};
}
举个例子,当按名字查询员工时,同时以它的 id 和 name 作为 key 将其缓存起来,下次按照 id 来查员工就直接可以从缓存中取数据,值得注意的是由于此方法也被 @CachePut 标注了,那么每次按照名字来查询都会调用此方法。
@Caching(
cacheable = {
@Cacheable(value="emp", key = "#name")
},
put = {
@CachePut(value = "emp", key = "#result.empId")
}
)
public Emp getNameByName(String name) {
System.out.println("按照名字查询...");
return empMapper.selectEmpByName(name);
}
@CaheConfig
该注解用来标注在类上,使用来抽取通用缓存配置的,其熟悉如下:
public @interface CacheConfig {
String[] cacheNames() default {};
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
}