Spring常用缓存注解@Cacheable, @CachePut, @CacheEvict, @Caching浅析

@Cacheable

作用

作用在方法上,也可以标记在一个类上

  • 当标记在一个方法上时表示该方法是支持缓存的
  • 当标记在一个类上时则表示该类所有的方法都是支持缓存

参数

value 缓存的名称

  • value参数是必须指定的,表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache
  • 每一个缓存名称代表一个缓存对象
  • 当一个方法填写多个缓存名称时将创建多个缓存对象
  • 当多个方法使用同一缓存名称时相同参数的缓存会被覆盖

key 缓存的key

  • key标记了缓存对象中的每一个缓存数据
  • 当我们没有指定该属性时,Spring将使用默认策略生成key
  • 系统会自动按照方法的所有入参生成key,也就是说相同的入参值将会返回同样的缓存结果

condition 缓存的条件

  • condition属性默认为空,表示将缓存所有的调用情形
  • 不为空时,满足条件后,方法的结果才会被缓存
  • 使用 SpEL表达式编写条件,返回 true 或者 false,只有为 true 才进行缓存
    //只有name长度大于6时才会进行缓存。
    @Cacheable(value="cache",condition="#ame.length()>6")

示例

    /**
     * #id 表示使用参数id作为key
     */
    @Cacheable(value="nameCache", key="#id")
    public String getName(Integer id) {
        return null;
    }
    /**
     * #p0 表示第一个参数
     */
    @Cacheable(value="nameCache", key="#p0")
    public String getName(Integer id) {
        return null;
    }
    /**
     * #user.id 表示User中的id值
     */
    @Cacheable(value="nameCache", key="#user.id")
    public String getName(User user) {
        return null;
    }
    /**
     * #p0.id 表示第一个参数里的id属性值
     */
    @Cacheable(value="nameCache", key="#p0.id")
    public String getName(User user) {
        return null;
    }
    /**
     * key 可以指定多字段拼接
     * 通过用户的id和code拼接当做key
     */
    @Cacheable(value="nameCache", key="#p0.id + '_' #p0.code")
    public String getName(User user) {
        return null;
    }

@CachePut

作用

  • 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
  • 和 @Cacheable 不同的是,@CachePut每次都会触发真实方法的调用
  • 此注解常被用于更新缓存使用

参数

同@Cacheable的参数一样

@CacheEvict

作用

  • 作用在方法上,根据一定的条件对缓存结果进行清空

参数

value 缓存的名称

删除指定名称的缓存对象

key 缓存的 key

删除指定key的缓存对象

condition 缓存的条件

删除指定条件的缓存对象

allEntries 清空所有缓存

  • 类型为布尔值
  • 默认为 false,如果指定为 true,则方法调用后将立即清空缓存对象下的所有缓存

beforeInvocation

  • 类型为布尔值
  • 默认为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存
  • 默认情况下,方法运行抛出异常时,不会清空缓存

@Caching

  • 此注解可以使我们在一个方法或者类上同时指定多个Spring Cache相关的注解
  • 三个属性
    • cacheable 对应@Cacheable
    • put 对应@CachePut
    • evict 对应@CacheEvict

示例

@Caching(cacheable = @Cacheable("nameCache"), evict = { @CacheEvict("nameCache"),@CacheEvict(value = "nameCache", allEntries = true) })
public String getName(Integer id) {
    return null;
}
© 版权声明
THE END
喜欢就支持一下吧
点赞0打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容