大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

spring的缓存使用

工作中用的缓存首选是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,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存