Spring(十二):缓存注解 @Cacheable, @CachePut, @CacheEvit 使用详解

  Spring 抽象出了统一的缓存接口来支持不同的缓存技术,提供了易于使用的缓存注解来操作缓存数据。

  在Spring Boot 项目中能使用注解则用注解,XML配置文件的方式是最后之选。

@Cacheable

先从缓存中获取,不存在则执行方法从库里获取返回数据,再把数据进行缓存。该注解作用在方法上,通常用于获取数据的方法。

属性

  1. String[] value:也可使用cacheNames,可理解为命名空间,指当前数据存在那个缓存里。
  2. String key:指命名空间下缓存数据唯一的key,一般取方法中具有唯一性的参数或具有唯一性的实体类属性作为 key。
  3. condition:触发缓存条件,满足条件时将数据加入缓存,默认为空,表示将全部数据加入缓存,支持SpEL

    示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //先从缓存中查找,没有再执行方法从数据库中查找返回,并缓存数据
    @Cacheable(key = "#categoryId", value = "category")
    public Category queryById(Long categoryId) {
    return categoryRepository.findById(categoryId).get();
    }

    //condition条件满足再缓存
    @Cacheable(value="andCache",condition="#userId.length < 10")
    public User queryByUserId(String userId) {
    return UserRepository.findById(userId).get();
    }

    @CachePut

    每次都会执行方法来获取数据,然后存入缓存;不会检查缓存来获取数据。该注解可作用在方法上,也可作用在类上,属性指定几乎和 @Cacheable一样。

属性

  1. String[] value():同上
  2. String key():同上
  3. String condition():同上

示例

1
2
3
4
5
6
7
/**
* 查数据并存缓存
*/
@CachePut(key = "#category.name", value = "category")
public Category queryByName(Category category) {
return categoryRepository.findOne(category).get();
}

@CacheEvit

用于清除缓存数据。可作用在方法上,也可作用在类上。当作用在类上时表示类中所有方法都会触发清除缓存的操作。

属性

  1. String[] value():同上
  2. String key():同上
  3. String condition():同上
  4. boolean allEntries():是否清除所有元素,默认为false,表示根据value来清除缓存;若设置为true,则清除所有数据。
  5. boolean beforeInvocation():是否在执行方法前清除缓存,默认为false,表示方法执行成功后清除缓存,若方法执行失败则不会执行清缓存的操作;如果设置为true,则改变了清除缓存的操作时间,缓存会在方法执行前被清除。

示例

1
2
3
4
5
6
7
8
9
/**
* 删除数据同时删除缓存
* @param categoryId
*/
@Override
@CacheEvict(value = "category")
public void deleteById(Long categoryId) {
categoryRepository.deleteById(categoryId);
}

cacke key

除了使用方法参数作为key和自定义key之外,Spring 还提供了一个 root 对象来获取元素作为key

属性名称 描述 示例
methodName 当前方法名 #root.methodName
method 当前方 #root.method.name
target 当前被调用的对象 #root.target
targetClass 当前被调用的对象的class #root.targetClass
args 当前方法名 #root.args[0]
caches 当前被调用的方法使用的Cache #root.caches[0].name

参考

  1. SpringCache缓存初探
  2. @Cacheable 缓存注解的用法
  3. Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用

Spring(十二):缓存注解 @Cacheable, @CachePut, @CacheEvit 使用详解

http://blog.gxitsky.com/2018/04/07/Spring-12-cache-annotation/

作者

光星

发布于

2018-04-07

更新于

2022-06-17

许可协议

评论