工作中用的缓存首选是redis,如果程序中需要用到二级缓存,则会选择google的二级缓存Guva Cache
spring3.1之后就引入了基于注解的缓存技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。
使用方法:
- 1.启动类上声明@EnableCaching
声明这个之后就省去了xml中对于CacheManager的配置 - 2.注解使用
@Cacheable
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
- [1] 主要参数
value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个
key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 - [2] 演示
//若缓存中没有,当userId大于0时将从数据库中查询到的结果存入缓存
@Cacheable(value = "level", key = "'user_level_'+#userId,condition = "#userId>0")
@Override
public LevelInfoBean getUserLevelInfo(int userId) {
LevelInfoBean levelInfoBean = new LevelInfoBean();
//TODO query in db
return levelInfoBean;
}
@CachePut
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,与Cacheable 不同的是,它每次都会触发真实方法的调用
- [参数同cacheable一样]
- [演示]
//每次给用户增加经验之后将新对象放回缓存
@CachePut(value = "level", key = "'user_level'+#userId)
@Override
public LevelInfoBean addUserLevelScore(int userId, long score) {
mapper.updateUserLevel(userId, score);
return this.getUserLevelInfo(userId, type);
}
@CacheEvict
- [参数]
value,key,condition同上,接,下来要讲一下这个注解独立的属性
allEntries:allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率
beforeInvocation:是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存