@CachePut:当需要更新缓存而不干扰方法的运行时 ,可以使用该注解。也就是说,始终执行该方法,并将结果放入缓存
本质上说,如果存在对应的缓存,则更新覆盖,不存在则添加;
示例代码: ?
/**
* .@CachePut既调用方法、又更新数据,达到同步更新缓存
* <p>
* 运行时机:
* 1、先调用目标方法 ★★★
* 2、将目标方法的结果缓存起来★★★
* 条件:存取Id的key要保持一致
* key = "#role.id" 传入员工的Id
* key = "#result.id" 使用返回员工的Id
* 注意: @Cacheable不能使用#result
* 因为 @Cacheable在目标方法执行之前需要得到这个key,所以不能用#result
*/
@Override
@CachePut(key = "#result.id")//更新或者添加缓存---》有则更新,无则添加
public Role update(Role role) {
roleMapper.updateByPrimaryKey(role);
return role;
}
查看缓存
?测试方法:
/**
* @Description 更新缓存
*/
@Test
public void testUpdate(){
Role role = Role.builder().id(5).rolecode("0055").rolename("0055Role").introduce("00555Introduce").build();
Role update = roleService.update(role);
System.out.println(update);
}
执行完查看控制台
JDBC Connection [HikariProxyConnection@776691105 wrapping com.mysql.cj.jdbc.ConnectionImpl@312819ae] will not be managed by Spring
==> Preparing: update role set roleName = ?, roleCode = ?, introduce = ? where id = ?
==> Parameters: 0055Role(String), 0055(String), 00555Introduce(String), 5(Integer)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4213bc3e]
Role(id=5, rolename=0055Role, rolecode=0055, introduce=00555Introduce)
查看缓存,没有对应的key的缓存则创建
?如果缓存中有对应的key的缓存,则覆盖
测试方法
@Test
public void testUpdate(){
Role role = Role.builder().id(5).rolecode("0055aaa").rolename("0055Roleaaa").introduce("00555Introduceaaa").build();
Role update = roleService.update(role);
System.out.println(update);
}
?查看缓存,覆盖了旧的数据