#启用基于注解的缓存
使用@EnableCaching,在Application中声明Caching
@EnableCaching
@SpringBootApplication
public class SpringbootApplication {
}
#在Server层的代码中使用@Cacheable
Cacheable属性:
cacheNames/value:缓存组名称
key:缓存数据(map结构)使用的key,默认是传入的值,例如查询id=1,缓存这条数据的key就为1
condition:设置缓存条件,符合条件才缓存
unless:否定缓存,符合条件就不缓存
sync:是否使用异步模式
@Service
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
/**
* @Cacheable
* 将方法的运行结果进行缓存,之后请求相同的数据,从缓存中获取,不再调用方法
* condition:第一个参数(id)的值大于1才缓存
* unless:第一个参数(id)的值等于2不缓存
*/
@Cacheable(cacheNames = "emp",condition = "#a0>1",unless = "#a0==2")
public Employee getEmpById(Integer id) {
System.out.println("查询" + id + "号员工");
Employee employee = employeeMapper.getEmpById(id);
return employee;
}
......
}
缓存的数据实际是保存在ConcurrentMapCache中的ConcurrentMap中,cacheNames/value是这个Map的名称,key默认是传入参数,但是通过SpEL命令规则可以自定义key。
第一次发送查询请求后,可在控制台看到数据查询的SQL语句,第二次查询时,没有打印,说明缓存成功。但是查询1号员工不会缓存,因为不满足condition条件,查询2号员工也不会缓存,因为满足unless条件。
#在Server层的代码中使用@CachePut
/**
* @CachePut
* 既调用方法,又更新缓存
*/
@CachePut(cacheNames = "emp",key = "#employee.id")
public Employee updateEmp(Employee employee) {
System.out.println("更新" + employee.getId() + "号员工");
employeeMapper.updateEmp(employee);
return employee;
}
使用@CachePut注解,在更新Employee表信息后,也会更新缓存中的数据。例如更新3号员工的邮箱后,再次查询3号员工的信息,发现即使没有查询数据库中信息,展示信息依然发生了改变。
注解中,cacheNames必须与上面的查询保持一致,key同样也要实际一致,才能正常更新缓存中的数据。
#在Server层的代码中使用@CacheEvict
/**
* @CacheEvict
* 清理缓存
* allEntries:是否清理全部缓存
* beforeInvocation:是否在方法执行之前执行缓存清空
* 默认false,方法发生异常,缓存不会被情空
* 改为true,无论方法是否正常执行,缓存都会被清空
*/
@CacheEvict(cacheNames = "emp", allEntries = false, beforeInvocation = false)
public int deleteEmpById(Integer id) {
System.out.println("删除" + id + "号员工");
return employeeMapper.deleteEmpById(id);
}
使用@CacheEvict注解,在删除Employee表中4号信息后,也会清理掉缓存中4号的数据。通过设置allEntries为true,当执行完某个特定方法后,清空cacheName指定的ConcurrentMap。
注解中,cacheNames和key必须与上面的查询保持一致
#最后还有一个@Caching,定义复杂的缓存规则
/**
* @Caching
* 定义复杂的缓存规则
*/
@Caching(
cacheable = {
@Cacheable(cacheNames = "emp",key = "#employee.id")
},
put = {
@CachePut(cacheNames = "emp",key = "#employee.id"),
@CachePut(cacheNames = "emp",key = "#employee.lastName")
}
)
public Employee insertEmp(Employee employee) {
System.out.println("新增" + employee.getId() + "号员工");
employeeMapper.insertEmp(employee);
return employee;
}