【缓存】@CachePut

@CachePut

功能:既调用方法又更新缓存数据。修改了数据库中的数据,同时更新缓存。

运行时机:
1、先调用目标方法
2、将目标方法的结果缓存起来

测试步骤:
1、查询1号员工http://localhost:8080/emp/1,查到的结果放到缓存中。
2、更新1号员工 http://localhost:8080/emp?id=1&lastName=zhangsan&gender=0
3、查询1号员工http://localhost:8080/emp/1,显示没更新前的员工,原因是第一次查询所缓存的员工默认的key是参数,也就是id,而更新员工时默认的key是employee对象。所以1号员工没有在缓存中更新。
示例:
【缓存】进一步分析@Cacheable的基础上进行修改:
EmployeeController类:

package com.qublog.cache.controller;

import com.qublog.cache.bean.Employee;
import com.qublog.cache.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    @GetMapping("/emp/{id}")
    public Employee getEmployee(@PathVariable("id") Integer id) {
        Employee emp = employeeService.getEmp(id);
        return emp;
    }

    @GetMapping("/emp")
    public Employee updateEmp(Employee employee) {
        Employee emp = employeeService.updateEmp(employee);
        return emp;
    }

}

EmployeeService类:
修改前:

package com.qublog.cache.service;

import com.qublog.cache.bean.Employee;
import com.qublog.cache.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    EmployeeMapper employeeMapper;

    //将方法的运行结果进行缓存,以后再要相同数据,直接从缓存中获取,不用调用方法
    @Cacheable(cacheNames = {"emp"})
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee emp = employeeMapper.getEmpById(id);
        return emp;
    }

    //key也可以使用#result.id
    @CachePut(value = "emp")
    public Employee updateEmp(Employee employee) {
        employeeMapper.updateEmp(employee);
        System.out.println("更新"+employee);
        return employee;
    }

}

修改后:

package com.qublog.cache.service;

import com.qublog.cache.bean.Employee;
import com.qublog.cache.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    EmployeeMapper employeeMapper;

    //将方法的运行结果进行缓存,以后再要相同数据,直接从缓存中获取,不用调用方法
    @Cacheable(cacheNames = {"emp"})
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee emp = employeeMapper.getEmpById(id);
        return emp;
    }

    //key也可以使用#result.id
    @CachePut(value = "emp",key = "#employee.id")
    public Employee updateEmp(Employee employee) {
        employeeMapper.updateEmp(employee);
        System.out.println("更新"+employee);
        return employee;
    }

}

修改后@CachePut达到了同步更新缓存的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值