使用@CachePut 更新数据库和更新缓存

 更新时间:2021年12月28日 08:45:06   作者:王某人i  
这篇文章主要介绍了使用@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的Graphics类进行绘图的方法详解

    使用Java的Graphics类进行绘图的方法详解

    这篇文章主要介绍了使用Java的Graphics类进行绘图的方法,是Java的GUI编程的基础,需要的朋友可以参考下
    2015-10-10
  • 使用IDEA创建java项目的步骤详解(hello word)

    使用IDEA创建java项目的步骤详解(hello word)

    这篇文章主要介绍了使用IDEA创建java项目的步骤详解(hello word),本文分步骤通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 关于Java的Character类详解

    关于Java的Character类详解

    这篇文章主要介绍了关于Java的Character类详解,Java中的Character类是一个包装类,用于封装一个基本数据类型char的值,它提供了一些静态方法来操作字符,需要的朋友可以参考下
    2023-05-05
  • java判断list不为空的实现,和限制条数不要在一起写

    java判断list不为空的实现,和限制条数不要在一起写

    这篇文章主要介绍了java判断list不为空的实现,和限制条数不要在一起写。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 一文带你弄懂Java中线程池的原理

    一文带你弄懂Java中线程池的原理

    工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线程池的原理吧
    2022-12-12
  • Java中Stream API的使用示例详解

    Java中Stream API的使用示例详解

    Java 在 Java 8 中提供了一个新的附加包,称为 java.util.stream,该包由类、接口和枚举组成,允许对元素进行函数式操作, 本文主要介绍了Java中Stream API的具体使用,感兴趣的小伙伴可以了解下
    2023-11-11
  • SpringBoot实现接口版本控制的示例代码

    SpringBoot实现接口版本控制的示例代码

    这篇文章主要介绍了springboot如何实现接口版本控制,接口版本控制,比如微服务请求中某个接口需要升级,正常做法是升级我们的版本,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • SpringMVC实现文件的上传和下载实例代码

    SpringMVC实现文件的上传和下载实例代码

    本篇文章主要介绍了SpringMVC实现文件的上传和下载实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot中数据传输对象(DTO)的实现

    SpringBoot中数据传输对象(DTO)的实现

    本文主要介绍了SpringBoot中数据传输对象(DTO)的实现,包括了手动创建DTO、使用ModelMapper和Lombok创建DTO的示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Java 泛型总结(三):通配符的使用

    Java 泛型总结(三):通配符的使用

    在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03

最新评论