配置 spring cache 和 redis 的整合
@Bean
public RedisCacheManager cacheManager(){
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate(redisConnectionFactory));
redisCacheManager.setDefaultExpiration(5l); // 设置默认的缓存过期时间(单位:秒)
Map<String, Long> expiresMap = new HashMap<String, Long>(); // 对某些命名空间单独设置过期时间
expiresMap.put("demo1", 5l);
expiresMap.put("demo2", 10l);
redisCacheManager.setExpires(expiresMap);
return redisCacheManager;
}
启用 spring cache 注解
@EnableCaching
使用:
实现类:@CacheConfig(cacheNames = "current service name")
方法上:@Cacheable
注意:
1、注解一定要加在service层的实现类上,而不是controller,也不是service的interface上;
2、如果有标明@Cacheable注解的方法所在类有实现了某个接口,那么接口中一定要声明该方法,不然缓存不起作用。(原因:spring包装实现类,只有接口里的方法是可见的)。
3、如果标明@Cacheable注解的方法没所在类没有实现任何接口,只需要声明为public即可。
注解:
------------------demo-----class--------------------------
@Service
@CacheConfig(cacheNames = "paomotemp")
public class MainTestServiceImpl implements MainTestService{
@Autowired
private BankInfoService bankInfoService;
public List<BankInfo> demo1(String id, String name, Integer age){
List<BankInfo> bankInfos = bankInfoService.getBankInfos();
System.out.println(bankInfos);
return bankInfos;
}
public List<BankInfo> demo2(BankInfo bankInfo){
List<BankInfo> bankInfos = bankInfoService.getBankInfos();
System.out.println(bankInfos);
return bankInfos;
}
public String demo3(){
return "1";
}
}
------------------demo-----class--------------------------
方法级别的注解
@Cacheable : 用于标识方法需要缓存
value/cacheNames:表示方法缓存所属的命名空间(可用类注解@CacheConfig的cacheNames代替,进行统一管理)
key:缓存名,所在命名空间内需唯一(详细:)。
自动生成:
demo1() :com.jiuhongpay.weixin_service.service.MainTestServiceImpl.demo1_4sd32
末尾的 “4sd32” 分别代表id、name、age的传参
demo2() :com.jiuhongpay.weixin_service.service.MainTestServiceImpl.printBankInfo_com.jiuhongpay.weixin_service.model.BankInfo@4238646b
自定义(表达式中表示某个字段一定要用“#”号开头,不然会报错。):
@Cacheable(key = "#bankInfo.bankId + #bankInfo.cardNo")
demo2() :43 //实体bankInfo中的 bankId = 4,cardNo = 3
condition:根据参数控制是否需要进行缓存,例如:
demo1()
//id 为3 的不缓存
@Cacheable(condition = "#id != '3'") //id是string,所以匹配要有单引号
//age 为3 的不缓存
@Cacheable(condition = "#age != 3") //age是int,匹配不需要单引号
注:string 匹配值不加单引号则匹配不上,同理,Integer 匹配值加了单引号也匹配不上
demo2()
//只有bankInfo.bankId 为4 并且 #bankInfo.cardNo 为'3'的进行缓存
@Cacheable(condition = "#bankInfo.bankId == 4 and #bankInfo.cardNo == '3'")
注:关系表达式可以用“and”、“or”、“&&”、“||”
unless:根据返回值控制是否需要进行缓存,例如:
demo3()
//返回值为 "1"的不进行缓存
@Cacheable(unless = "#result == '1'")
注:#result 代表返回结果值
@CacheEvict : 用于标识删除某数据缓存
value/cacheNames:表示方法缓存所属的命名空间(必填)
key:缓存名(必填)
allEntries :为true时,表示全部删除。默认值为false。
例如:
demo1()
//进行查询的方法,需缓存
@Cacheable(key = "'bankinfo_' + #id")
demo3()
//进行删除的方法,对demo1()结果的缓存进行删除
@CacheEvict(value = "paomotemp", key = "'bankinfo_' + #id")
@CachePut : 一般用于新增/修改方法,调用方法时会自动把相应的数据放入缓存,并每次都会请求db,用法等同于 @Cacheable ,但不会像 @Cacheable 一样,如果有缓存就直接读缓存。
类级别的注解
@CacheConfig : 用于声明命名空间
cacheNames : 一般一个实现类是一个命名空间,声明后,@Cacheable 、 @CachePut 中的 value 和 cacheNames 就可以被替代,不需要被声明
例如:demo class 中的 MainTestServiceImpl
命名规则建议:
@CacheConfig
cacheNames 使用每个实现类所属的接口名称,例如:
@CacheConfig(cacheNames = "bankInfoService")
@Cacheable
value 如果使用默认的过期时间,那么不需要定义;
如果有自己特殊的自定义过期时间,则使用每个实现类所属的接口名称 + 下划线 + 时间(单位秒),例如:
@Cacheable(value = "bankInfoService_10")
注:如果使用自定义的过期时间,需要去 spring cache 和 redis 的整合类中配置过期时间map。
key 方法名 + 参数,例如:
@Cacheable(key = "'getById_' + #id")
public BankInfo getById(Integer id);
springdataredis的clear方法
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:android js 文件传输
下一篇:python快速去除非数字字符
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
vector::clear ()方法的使用细节
原型:#include <vector>void clear(): 函数clear()删除储存在vector中的所有元素.
C++ vectorclear vector clear 使用细节 -
springDataRedis操作
快速操作springdataredis
redis 数据库 java 数据类型 取值 -
Hibernate的clear(),flush(),evict()方法详解
1.Clear方法 无论是Load还是Get都会首先查找缓存(一级缓存)如果没有,才会去数据库查找,调用
数据库 hibernate 缓存 get方法 sql语句