24、springboot与缓存(2)
具体看上文!!!
@Service public class EmpService { @Autowired EmployeeMapper employeeMapper; @Cacheable(cacheNames ="e") public Employee getEmp(Integer id){ System.out.println("查询:" + id +"员工"); Employee emp = employeeMapper.getEmpById(id); return emp; } @CachePut(value = "e") public Employee update(Employee employee){ System.out.println("update。。。。"); employeeMapper.updateEmp(employee); return employee; } }
@ResponseBody @RequestMapping("/emps") public Employee update(Employee employee){ Employee emp = empService.update(employee); return emp; }
@CachePut:即调用方法还更新数据
修改了数据库同时更新缓存
1.运行时机先调用目标方法
2.将目标方法保存
步骤:
1、查询1号员工,查到的结果会在缓存中
2、之后的查询还是之前的结果
3、更细员工
4、再次查询
此时的结果时之前的结果
1号员工没有在缓存中更新
此时测试流程:
此时的该标签需要拿到返回值,且它的名字value和cacheName相同
@CacheEvict:缓存清除
删除指定的key
@CacheEvict(value = "emp",key = "#id") public void del(Integer id){ System.out.println("del:"+ id); //employeeMapper.deleteEmpById(id); }
@ResponseBody @RequestMapping("/del") public String del(Integer id){ empService.del(id); return "success del "; }
假设同时查询1,2两个员工,然后删除1,再去查2,依然不会调用数据库
@CacheEvict(value = "e",allEntries = true) public void del(Integer id){ System.out.println("del:"+ id); //employeeMapper.deleteEmpById(id); }
假设同时查询1,2两个员工,然后删除1,再去查2,会调用数据库
@Caching() 定义复杂的缓存规则
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Caching { Cacheable[] cacheable() default {}; CachePut[] put() default {}; CacheEvict[] evict() default {}; }
EmployeeMapper.java
@Select("SELECT * FROM employee WHERE lastName = #{lastName}") Employee getEmpByLastName(String lastName);
EmpService.java
@Caching( cacheable = { @Cacheable(value = "emp",key = "#lastname") }, put = { @CachePut(value = "emp",key = "#result.id"), @CachePut(value = "emp",key = "#result.email") } ) //此时会将该数据的id、email、lastname数据都加载缓存中 public Employee getByName(String lastname){ return employeeMapper.getEmpByLastName(lastname); }
此时可以将lastname、id、email都可以查询的到
controller.java
@ResponseBody @RequestMapping("/caching/lastname/{lastname}") public Employee Cachings(@PathVariable("lastname") String lastname){ Employee emp = empService.getByName(lastname); return emp; }
此时查询id=2的用户依然会在缓存中进行查询
控制台并没有进行打印。
@CacheConfig 缓存注解配置类,此时可以指定所有所有的value等属性,不需要手动多次写
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CacheConfig { String[] cacheNames() default {}; String keyGenerator() default ""; String cacheManager() default ""; String cacheResolver() default ""; }