使用@CachePut 更新数据库和更新缓存
关于更新缓存 ,要注意两点
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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java 添加、删除、格式化Word中的图片步骤详解( 基于Spire.Cloud.SDK for Java )
这篇文章主要介绍了Java 添加、删除、格式化Word中的图片( 基于Spire.Cloud.SDK for Java ),本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-08-08springboot 在xml里读取yml的配置信息的示例代码
这篇文章主要介绍了springboot 在xml里读取yml的配置信息的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09解决ThingsBoard编译报错问题:Failure to find org.gradle:gradle-too
这篇文章主要介绍了ThingsBoard编译报错:Failure to find org.gradle:gradle-tooling-api:jar:6.3,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-03-03springboot 如何解决static调用service为null
这篇文章主要介绍了springboot 如何解决static调用service为null的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06
最新评论