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、重启项目,再按上面步骤执行;可以发现更新之后,查询也查询的是更新之后的数据了

 
posted @   Arbitrary233  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示