一、JSR107缓存规范
-
CachingProvider 【缓存提供者】
定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider
-
CacheManager 【缓存管理】
定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有
-
Cache 【缓存】
是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有
-
Entry 【条目】
是一个存储在Cache中的key-value对
-
Expiry 【到期】
每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置
springboot 常用缓存注解
Cache | 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等 |
---|---|
CacheManager | 缓存管理器,管理各种缓存(Cache)组件 |
@Cacheable | 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存(添加缓存) |
@CacheEvict | 清空缓存 |
@CachePut | 保证方法被调用,又希望结果被缓存(修改缓存) |
@EnableCaching | 开启基于注解的缓存 |
keyGenerator | 缓存数据时key生成策略 |
serialize | 缓存数据时value序列化策略 |
1.开启缓存的注解,启动类上 @EnableCaching
2.标注缓存注解
CacheManager管理多个cache组件的,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字;
注解说明:
@Cacheable 将【方法】的运行结果进行缓存
注解属性说明:
属性 | 属性值 | 备注 |
---|---|---|
value / cacheNames | 例:test | 指定缓存的名字 |
key | 例:#id | 缓存数据使用的key,默认是使用方法的参数值 编写spel |
keyGenerator | 例: | 写一个配置类加上注解 @Configuration 【key和keyGenerator 二选一】 |
cacheManage | 例: | 写一个配置类加上注解 @Configuration 缓存管理器【指定当前缓存放在哪个管理器中】 |
condition | 例: #a0 > 1 | 符合指定条件的情况下才缓存 |
unless | 例: #p0 <= 1 | 当unless指定条件为true,方法的返回值就不会缓存 |
sync | 例: false | 是否异步处理,默认为false |
key的spel表达式部分语法:
/**
* key 的方法属性: spel表达式:
* #root.methodName 获取到被调用的【方法名字】
* #root.method.name 获取到被调用的【方法名字】
* #root.target 当前被调用的【目标对象】
* #root.targetClass 当前被调用的【目标对象类】
* #root.args[0] 当前被调用的方法的【参数列表】
* #root.caches[0].name 当前方法被调用使用的缓存列表
* #iban、#a0、#p0 #参数名, #a0 或 #p0 ,0代表参数的索引
* #result 方法执行后的返回值
*/
keyGenerator自定义key的生成的配置:
/**
* 自定义生成 key 的生成规则
* Bean的默认名字为 【方法名】
*/
@Bean(value = "myKeyGenerator")
public KeyGenerator myKeyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
// 自定义key的生成策略
return method.getName()+ Arrays.asList(params).toString();
}
};
}
cacheManage缓存管理器配
/**
* 【redis缓存管理与springboot注解整合】
* @Primary 表示这是默认的 缓存管理器
* Bean的名字默认为 【方法名】
*/
@Primary
@Bean
public RedisCacheManager myRedisCacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMillis(-1))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.transactionAware()
.build();
return cacheManager;
}
@CachePut 修改数据的同时,也会修改缓存
属性值同上
@CacheEvict 清空缓存
属性 | 属性值 | 备注 |
---|---|---|
allEntries | 例: false | 是否清空所有缓存 |
beforeInvocation | 例: false | 是否在方法执行之前清空缓存 |
@Caching 多条件复制缓存条件
@Caching(
cacheable = {
@Cacheable(cacheNames = "uav2",key = "#p0")
},
put = {
// cachePut 出现时,这个方法一定会执行
@CachePut(cacheNames = "uav2",key = "#result.id"),
@CachePut(cacheNames = "uav2",key = "#result.username")
}
)
@CacheConfig 用在类上面,指定当前类下面缓存的通用属性
引入maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
部分配置application.yml
spring:
redis:
host: 47.101.50.211
database: 1
port: 6379
password: 123456
jedis:
pool:
# 连接池最大连接数,负值表示没有限制
max-active: 100
# 连接池最大阻塞等待时间 -1 表示没有限制
max-wait: -1ms
# 连接池中最大空闲连接
max-idle: 10
# 连接池中最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 1000