SpringBoot中@Cacheable、@CacheEvict和@CachePut缓存注解的简介说明
我们都知道Spring从3.1开始引入Cache支持
当我们调用一个缓存方法时,会自动将方法的参数和返回结果作为键值对放入到缓存中
待下次使用时,同样的参数调用该方法时,无需实际运行方法,只需从缓存中获取方法的结果即可
以上就是Spring缓存的相关简介说明
即可实现Spring Cache缓存参数和方法的结果
当我们调用一个缓存方法时,会自动将方法的参数和返回结果作为键值对放入到缓存中
待下次使用时,同样的参数调用该方法时,无需实际运行方法,只需从缓存中获取方法的结果即可
以上就是Spring缓存的相关简介说明
Springboot中开启缓存的方法
只需在SpringBoot的启动类上加上 @EnableCaching 即可开启缓存 2.指定方法上使用缓存 采用以上方法即可在SpringBoot上使用缓存SpringBoot支持注解,所以我们通常使用注解标记方法
即可实现Spring Cache缓存参数和方法的结果
常见的注解 @Cacheable 和 @CacheEvict
使用@Cacheable标记的方法在执行后
Spring Cache 将缓存其返回结果
而使用 @CacheEvict 标记的方法
会在方法执行前或者执行后移除Spring Cache中的某些元素
@Cacheable简介
@Cacheable:可标记在类上或方法上
当标记在方法上时
指该方法是支持缓存的
当标记在类上时则指该类所有的方法都是支持缓存的
对于支持缓存的方法
Spring会在其被调用后将其返回值缓存起来
当下次使用相同参数来运行该方法时
可直接从缓存中获取结果
而无需要再次运行该方法
Spring在缓存方法的返回值时是以键值对进行缓存的
值就是方法的返回结果
键:Spring 支持两种策略
默认策略和自定义策略
注意事项:
当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的
@Cacheable使用说明: 可指定三个属性,value、key 和 condition。
【value 属性指定 Cache 名称】
value 是必须指定的
指当前方法的返回值被缓存在哪个 Cache 上
对应 Cache 的名称
其可以是一个 Cache 也可以是多个 Cache
当需要指定多个 Cache 时其是一个数组。
@Cacheable("cache1")//Cache是发生在cache1上的
public User find(Integer id) {
return null;
}
@Cacheable({"cache1", "cache2"})//Cache是发生在cache1和cache2上的
public User find(Integer id) {
return null;
}
【使用 key 属性自定义 key】
key 属性是用来指定Spring 缓存方法的返回结果时对应的 key
该属性支持 SpringEL 表达式
当没有指定该属性时
Spring 将使用默认策略生成 key。
自定义策略是指可以通过 Spring 的 EL 表达式来指定 key
EL 表达式可以使用方法参数及它们对应的属性
使用方法参数时可以直接使用#参数名或者#p参数index
如:
//key是指传入时的参数
@Cacheable(value="users", key="#id")
public User find(Integer id) {
return null;
}
// 表示第一个参数
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
return null;
}
// 表示User中的id值
@Cacheable(value="users", key="#user.id")
public User find(User user) {
return null;
}
// 表示第一个参数里的id属性值
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
return null;
}
除以上使用方法参数作为 key 之外
Spring 还提供一个root对象可以用来生成 key
使用该root对象可以获取到以下信息
使用root对象的属性作为key时
也可将“#root”省略
因为 Spring 默认使用的就是 root 对象的属性
如:
// key值为:user中的name属性的值
@Cacheable(value={"users", "xxx"}, key="caches[1].name")
public User find(User user) {
return null;
}
【condition 属性指定发生的条件】
有时候可能并不希望缓存一个方法的所有返回结果
condition 属性默认为空
表示将缓存所有的调用情形
其值是通过 SpringEL 表达式来指定的
当为 true 时表示进行缓存处理;
当为 false 时表示不进行缓存处理
即每次调用该方法时该方法都会执行一次
如下表示只有当 user 的 id 为偶数时才会缓存
// 根据条件判断是否缓存
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
System.out.println("find user by user " + user);
return user;
}
@CachePut
使用@Cacheable 标注的方法
Spring 在每次执行前都会检查Cache中是否存在相同 key 的缓存元素
如果存在就不再执行该方法,而直接从缓存中获取结果进行返回
否则才会执行并将返回结果存入指定的缓存中
@CachePut 也可以声明一个方法支持缓存功能
与 @Cacheable不同的是使用@CachePut标注的方法
在执行前不会去检查缓存中是否存在之前运行的结果
而是每次都会运行该方法
并将执行结果以键值对的形式存入指定的缓存中
//@CachePut也可以标注在类或方法上
//可指定的属性跟@Cacheable是一样的
@CachePut("users")//每次都会执行方法,并将结果存入指定的缓存中
public User find(Integer id) {
return null;
}
@CacheEvict
@CacheEvict是
用来标注在需要清除缓存元素的方法或类上的
当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作
@CacheEvict可指定的属性
有 value、key、condition、allEntries 和 beforeInvocation
其中 value、key 和 condition 的语义与 @Cacheable 对应的属性类似
即 value 表示清除操作是发生在哪些 Cache 上的(对应 Cache 的名称);
key 表示需要清除的是哪个 key,
如未指定则会使用默认策略生成的 key;
condition 表示清除操作发生的条件。
【allEntries 属性】
allEntries 是 boolean 类型
指是否需要清除缓存中的所有元素
默认为 false,表示不需要
当指定allEntries为true时
Spring Cache 将忽略指定的 key
有的时候需要 Cache 一下清除所有的元素,这比一个一个清除元素更有效率。
@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}
【beforeInvocation 属性】
清除操作默认是在对应方法成功执行之后触发的
如果方法抛出异常而未能成功返回时不会触发清除操作
使用 beforeInvocation 可以改变触发清除操作的时间
当指定该属性值为 true 时
Spring 会在调用该方法之前清除缓存中的指定元素
@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}
除使用@CacheEvict清除缓存元素外
当使用Ehcache作为实现时
也可配置Ehcache自身的清除策略
通过 Ehcache 的配置文件来指定的。
@Caching
@Caching注解
可在一个方法
或
类上同时指定多个Spring Cache相关的注解
其拥有三个属性:
cacheable、put 和 evict
分别用于指定 @Cacheable、@CachePut 和 @CacheEvict
@Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
@CacheEvict(value = "cache3", allEntries = true) })
public User find(Integer id) {
return null;
}
使用自定义注解
Spring允许在配置可缓存的方法时使用自定义的注解
前提是自定义的注解上必须使用对应的注解进行标注
如有如下这么一个使用 @Cacheable 进行标注的自定义注解:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.Runtime)
@Cacheable(value="users")
public @interface MyCacheable {
}
需缓存的方法上使用 @MyCacheable 进行标注也可以达到同样的效果。
@MyCacheable
public User findById(Integer id) {
System.out.println("find user by id: " + id);
User user = new User();
user.setId(id);
user.setName("Name" + id);
return user;
}
Spring缓存应用场景
1.@CachePut:更新数据库的数据并更新缓存
先调用更新数据库方法
再将更新的数据写入名为(users)缓存中
@PostMapping(value = "/updateUserInfo")
@CachePut(value = "users", key = "#user.userId")
public void updateUserInfo(User user) {
userService.updateUserInfo(user);
}
2.@Cacheable:查询出的数据是最新的而不是之前缓存中的
这里 value 属性的值同 @CachePut 时的 value 值一样,确保查询与更新都是同一块缓存。
此时查询的 key 要和更新的 key 保持一致,确保拿到的是更新后的数据。
@GetMapping(value = "/queryUserInfo/{userId}")
@Cacheable(value = "users", key = "#userId")
public User queryUserInfo(@PathVariable("userId")Integer userId) {
userService.queryUserInfo(userId);
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


