SpringBoot-缓存
SpringBoot缓存
Spring
从3.1开始定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager
接口来统一不同的缓存技术;并支持使用Java Caching(JSR-107)
注解简化我们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。
JSR107核心接口
Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和 Expiry。
-
CachingProvider:创建、配置、获取、管理和控制多个CacheManager
-
CacheManager:创建、配置、获取、管理和控制多个唯一命名的Cache,Cache存在于CacheManager的上下文中。一个CacheManager仅对应一个CachingProvider
-
Cache:是由CacheManager管理的,CacheManager管理Cache的生命周期,Cache存在于CacheManager的上下文中,是一个类似map的数据结构,并临时存储以key为索引的值。一个Cache仅被一个CacheManager所拥有
-
Entry:是一个存储在Cache中的key-value对
-
Expiry:每一个存储在Cache中的条目都有一个定义的有效期。一旦超过这个时间,条目就自动过期,过期后,条目将不可以访问、更新和删除操作。缓存有效期可以通过ExpiryPolicy设置
SpringBoot缓存注解
@Cacheable:
针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict:
清空缓存
@CachePut:
既调用方法,又更新缓存数据
@EnableCaching:
开启基于注解的缓存
@Caching:
定义复杂的缓存规则
@CacheConfig
:使用在类上,用于将缓存的共同配置提取出来
SpringBoot缓存的使用方法
1、
:导入缓存依赖启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2、
在主启动类
上添加启动缓存的注解
@EnableCaching
3、
在需要缓存的类或方法上添加缓存注解
即可
@Cacheable
@Cacheable:
针对方法配置,能够根据方法的请求参数对其结果进行缓存。先查看是否有缓存结果,没有才执行方法
可选参数
cacheNames/value
:指定缓存组件的名字,数组形式。
key
:缓存数据使用的key,确定缓存可以用唯一key进行指定;eg:编写SpEL; #id,参数id的值 ,,#a0(第一个参数), #p0(和a0的一样的意义) ,#root.args[0]
keyGenerator
:key的生成器;可以自己指定key的生成器的组件id(注意: key/keyGenerator:二选一使用;不能同时使用)
cacheManager
:指定缓存管理器;或者cacheResolver指定获取解析器
condition
:指定符合条件的情况下才缓存;使用SpEl表达式,eg:condition = "#a0>1":第一个参数的值>1的时候才进行缓存
unless
:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;eg:unless = "#a0!=2":如果第一个参数的值不是2,结果不缓存;
sync
:是否使用异步模式
自定义key
的生成策略:给容器注入一个KeyGenerator
即可,使用时keyGenerator="keyGenerator(注入的组件名)"
package com.wyx.config;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
import java.util.Arrays;
@Configuration
public class CacheConfig {
@Bean
public KeyGenerator keyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
/* 主键生成策略
target 目标对象
method 方法
params 参数
*/
return method.getName()+"["+ Arrays.asList(params).toString()+"]";
}
};
}
}
@CachePut
@CachePut:
既调用方法,又更新缓存数据,先执行方法,再更新缓存
可选参数和 @Cacheable 差不多,具体查看上面即可,
因为该方法是执行完方法才更新缓存,于是可以使用
result
获取返回值的属性 key = "#result.参数"
@CacheEvict
@CacheEvict:
清空缓存。
可选参数
key:指定要清除的数据
allEntries = true:指定清除这个缓存中所有的数据
beforeInvocation = false:默认代表缓存清除操作是在方法执行之后执行
beforeInvocation = true:代表清除缓存操作是在方法运行之前执行
@Caching
@Caching:
定义复杂的缓存规则
用于定义复杂的缓存规则,它是@Cacheable
、@CachePut
、@CacheEvict
的组合注解,使用示例如下
@Caching(
//
cacheable = {
@Cacheable(/*value={"emp"},*/key = "#lastName"),
@Cacheable(规则)
},
put = {
@CachePut(/*value={"emp"},*/key = "#result.id"),
@CachePut(规则)
},
evict = {
@CacheEvict(规则),
@CacheEvict(规则)
}
)
public Employee getEmpByLastName(String lastName){
return employeeMapper.getEmpByLastName(lastName);
}
@CacheConfig
@CacheConfig
:使用在类上,用于将缓存的共同配置提取出来
可选参数
cacheNames
:指定缓存组件的名字,数组形式。
keyGenerator
:key的生成器;可以自己指定key的生成器的组件id(注意: key/keyGenerator:二选一使用;不能同时使用)
cacheManager
:指定缓存管理器;或者cacheResolver指定获取解析器
cacheResolver
指定缓存解析器
Cache-SpEL
名称 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root对象 | 当前被调用的方法名 | #root.methodname |
method | root对象 | 当前被调用的方法 | #root.method.name |
target | root对象 | 当前被调用的目标对象实例 | #root.target |
targetClass | root对象 | 当前被调用的目标对象的类 | #root.targetClass |
args | root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root对象 | 当前方法调用使用的缓存列表 | #root.caches[0].name |
argument Name | 执行上下文(avaluation context) | 当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数 | #artsian.id |
result | 执行上下文(evaluation context) | 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false) | #result |