cache
1、@Cacheable
记得类上面添加:@EnableCaching
/**
* 将方法的运行结果进行缓存;以后再要相同的数据,直接从缓存中获取,不用调用方法
* CacheManager管理多个Cache组件的,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字
* 几个属性:
* cacheNames/values:指定缓存组件的名字;将方法返回的结果放在哪个缓存中,是数组的方式,可以指定多个缓存
* key:缓存数据使用的key,可以用它来指定。默认是使用方法参数的值 1-方法的返回值
* 编写SpEL; #id;参数id的值 #a0 #p0 #root.args[0]
* keyyGenerator:key的生成器;可以自己指定key的生成器组件id
* key/keyGenerator:二选一使用
* cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器
* condition:指定符合条件的情况下才缓存
* unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断
* unless = "#result == null"
* unless = "#a0==2":如果第一个参数的值是2,结果不缓存
* sync:是否使用异步模式
*/
@Cacheable(cacheNames = {"emp"})
public Employee getEmp(Integer id){
System.out.println("查询"+id+"号员工");
Employee employee = employeeMapper.getEmpById(id);
return employee;
}
2、@CachePut更新缓存
/**
* @CachePut:即调用方法,又更新缓存数据
* 修改了数据库的某个数据,同时更新缓存
* 运行时机:
* 1、先调用目标方法
* 2、将目标方法的结果缓存起来
*
* 测试步骤:
* 1、查询1号员工;查到的结果会放在缓存中
* key: 1 value:lastName:张三
* 2、以后查询还是之前的结果
* 3、更新1号员工:【lastName:zhangsan; gender:0】
* 将方法的返回值也放进缓存了
* key:传入的employee对象 值:返回的employee对象
* 4、查询1号员工?
* 应该是更新后的员工:
* key = "#employee.id":使用传入的参数的员工id
* key = "#result.id":使用返回后的id
* @Cacheable的key是不能用#result
* 为什么是没更新前的?【1号员工没有在缓存中更新】
*/
@CachePut(value = "emp",key = "#employee.id")
public Employee updateEmp(Employee employee){
employeeMapper.updateEmp(employee);
return employee;
}
3、@CacheEvict缓存清除
/**
* @CacheEvict:缓存清除
* key:指定要清楚的数据
* allEntries = true: 指定清楚这个缓存中所有的数据
* beforeInvocation = false: 缓存的清楚是否在方法之前执行
* 默认代表缓存清除操作方法是在方法之后执行的;如果出现异常缓存就不会清楚
*
*/
@CacheEvict(value = "emp",key = "#id")
public void deleteEmp(Integer id){
System.out.println("deleteEmp:"+id);
//employeeMapper.deleteEmpBuId(id);
}
4、@Caching和@Config
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "#lastName")
},
put = {
@CachePut(value = "emp",key = "#result.id"),
@CachePut(value = "emp",key = "#result.email"),
}
)
@ResponseBody
@RequestMapping("/emp/lastName/{lastName}")
public Employee getEmpByLastName(@PathVariable("lastName") String lastName){
Employee employee = employeeService.getEmpByLastName(lastName);
return employee;
}
}
@CacheConfig(cacheNames=“emp”)用于标注在类上,可以存放该类中所有缓存的公有属性,比如设置缓存的名字。