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

网友投稿 339 2022-11-11

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

目录关于更新缓存 ,要注意两点1、@Cacheable的key2、@CachePut的返回值缓存的CachePut冲突Cacheable可以分解成两个

关于更新缓存 ,要注意两点

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 = http://"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")}

)eWPJzX

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(kehttp://y = "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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:操作系统和Linux
下一篇:LVS负载均衡
相关文章

 发表评论

暂时没有评论,来抢沙发吧~