• 30、springboot——缓存之JSR107——@CachePut的使用③


    @CachePut:即调用方法还更新数据
          修改了数据库同时更新缓存
    实例讲解:
      在上一节的基础上EmployeeService中添加更新员工的方法,这里指定把返回结果放入的缓存组件和查询方法是一样的(组件名唯一)
      另外把上一节中自定义的key生成器注解掉了
    @Service
    public class EmployeeService {
    
        @Autowired
        EmployeeMapper employeeMapper;
    
        @Cacheable(cacheNames = {"emp"})    //,keyGenerator = "myKeyGenerator",condition = "#id>1"
        public Employee getEmp(Integer id){
            System.out.println("查询"+id+"号员工");
            Employee employee = employeeMapper.getEmpById(id);
            return employee;
        }
    
    
        /**
         * @CachePut:既调用方法,又更新缓存数据
         *  修改数据库中某个数据,同时更新缓存
         *     运行时机:
         *      1、先调用目标方法
         *      2、将目标方法的放回结果缓存起来
         */
        @CachePut(value = {"emp"})
        public Employee updateEmp(Employee employee){
            System.out.println("更新了"+employee.getId()+"号员工的信息");
            employeeMapper.updateEmp(employee);
            return employee;
        }
    }

      controller层添加相应方法(这里只是简单测试缓存的知识点,所以简单用的Get请求)

        @GetMapping("/emp")
        public Employee updateEmployee(Employee employee){
            Employee emp = employeeService.updateEmp(employee);
            return emp;
        } 
    测试步骤:
      1、查询2号员工的数据,查到的数据会放在缓存中
      {"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null}
      2、以后查询还是之前的数据
      3、更新2号员工;同时更新了缓存    emp?id=2&lastName=王五&email=wangwu@qq.com&gender=1

      4、更新成功后我们再查询2号员工没有发送查询语句,只是在缓存中查找

          但查出的数据还是{"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null}

          并没有拿到2号员工更新后的数据;这是为什么?

          原因是:虽然查询和更新后的返回结果都是放入指定emp缓存组件中,

              但是两个方法执行后放入缓存组件中的key不一样,

              所以在查询中通过查询方法中的key找的2号员工,而更新方法中是根据更新方法中的key更新2号员工

              自然是两个互不影响的数据,所以想要更新方法执行时缓存中更新的同一个数据

                只需要把两个方法的key值统一,查询和更新之后缓存中的数据就是同一个了

        5、修改service的update方法:

        /**
         * @CachePut:既调用方法,又更新缓存数据
         *  修改数据库中某个数据,同时更新缓存
         *     运行时机:
         *      1、先调用目标方法
         *      2、将目标方法的放回结果缓存起来
         *
         * 测试步骤:
         *      1、查询2号员工的数据,查到的数据会放在缓存中{"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null}
         *      2、以后查询还是之前的数据
         *      3、更新2号员工;同时更新了缓存    emp?id=2&lastName=王五&email=wangwu@qq.com&gender=1
         *      4、更新成功后我们再查询2号员工没有发送查询语句,只是在缓存中查找
         *              但查出的数据还是{"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null}
         *              并没有拿到2号员工更新后的数据;这是为什么?
         *              原因是:虽然查询和更新后的返回结果都是放入指定emp缓存组件中,
         *                      但是两个方法执行后放入缓存组件中的key不一样,
         *                      所以在查询中通过查询方法中的key找的2号员工,而更新方法中是根据更新方法中的key更新2号员工
         *                      自然是两个互不影响的数据,所以想要更新方法执行时缓存中更新的同一个数据,
         *                      只需要把两个方法的key值统一,查询和更新之后缓存中的数据就是同一个了
         *                      key = "#result.id"或者
         *                      key = "#employee.id" 这里效果都一样(注意在@Cacheable注解中的key不能用#result;因为@Cacheable在执行方法之前需要根据key查询缓存*/
        @CachePut(value = {"emp"},key = "#result.id")
        public Employee updateEmp(Employee employee){
            System.out.println("更新了"+employee.getId()+"号员工的信息");
            employeeMapper.updateEmp(employee);
            return employee;
        }

      6、重启项目,再按上面步骤执行;可以发现更新之后,查询也查询的是更新之后的数据了

     
  • 相关阅读:
    2.Mysql集群------Mycat读写分离
    ASP.NET Core 认证与授权[4]:JwtBearer认证
    API做翻页的两种思路
    C# 8
    ASP.NET Core 认证与授权[2]:Cookie认证
    ASP.NET Core 认证与授权[1]:初识认证
    Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截
    C#中out和ref的区别
    存储过程的优缺点
    存储过程的作用和意义,讲的很好
  • 原文地址:https://www.cnblogs.com/lyh233/p/12560361.html
Copyright © 2020-2023  润新知