使用@CachePut 更新数据库和更新缓存
时间:2022-03-17 09:53:03|栏目:JAVA代码|点击: 次
关于更新缓存 ,要注意两点
1、@Cacheable的key
要和@CachePut 的key一致
比如:
@Cacheable(key = "'userCache'") //缓存,
public Uuser findByEmail(String email) {
System.err.println("执行这里,说明缓存中读取不到数据,直接读取数据库....");
return redisMapper.findByEmail(email);
}
@CachePut(key = "'userCache'") //userCache要加‘'单引号,表示这是一个字符串
public Uuser updateSelf(String nickname, String email) {
System.err.println("执行这里,更新数据库,更新缓存....");
uuserMapper.updateSelf(nickname, email);
Uuser uuser = redisMapper.findByEmail(email);
return uuser;
}
2、@CachePut的返回值
要和@Cacheable的返回值一样
如果@Cacheable 返回的是一个对象,@CachePut 返回也要是对象,否则会报类型转换异常,如上代码 返回的都是 Uuser.
缓存的CachePut冲突Cacheable
CachePut 跟 Cacheable放在一起, Cacheable的效果就跟 CachePut 一样的,每次都会去查数据库,虽然有缓存。
/**
*
* @param id
* @return
*/
@Caching( put = {
@CachePut(key = "T(cn.a.b.constant.RedisKey).OPEN_MEDIUM_INFO + #result.mediumBankCard", unless="#result.mediumBankCard==null or #result.status !='2'"),
@CachePut(key = "T(a.b.c.constant.RedisKey).ACCOUNT_CODE + #result.accountCode", unless="!{'0','1','2','3'}.contains(#result.mediumStatus)"),
@CachePut(key = "T(a.b.c.constant.RedisKey).CERT_NO+ #result.certNo", unless="#result.certNo==null or !{'0','1','2','3'}.contains(#result.status)")
}
, cacheable = {@Cacheable(key="T(a.b.c.constant.RedisKey).ID + #id")}
)
public XXXInfo selectByPrimaryKey(Long id){
return mapper.selectByPrimaryKey(id);
}
可以分解成两个
Service.java
/**
*
* @param id
* @return
*/
@Caching( put = {
@CachePut(key = "T(cn.a.b.constant.RedisKey).OPEN_MEDIUM_INFO + #result.mediumBankCard", unless="#result.mediumBankCard==null or #result.status !='2'"),
@CachePut(key = "T(a.b.c.constant.RedisKey).ACCOUNT_CODE + #result.accountCode", unless="!{'0','1','2','3'}.contains(#result.mediumStatus)"),
@CachePut(key = "T(a.b.c.constant.RedisKey).CERT_NO+ #result.certNo", unless="#result.certNo==null or !{'0','1','2','3'}.contains(#result.status)")
}
)
public XXXInfo selectByPrimaryKey(Long id){
return mapper.selectByPrimaryKey(id);
}
Mapper.java
{
@Cacheable(key="T(a.b.c.constant.RedisKey).ID + #p0")
XXXXInfo selectByPrimaryKey(Long id);
}
mybatis 接口类参数。用#参数名无效。 只能用#p0, #p1


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




