spring的缓存使用

作者: H_Man | 来源:发表于2018-08-10 15:08 被阅读3次

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

    相关文章

      网友评论

        本文标题:spring的缓存使用

        本文链接:https://www.haomeiwen.com/subject/mlgkbftx.html