Spring Cache
阅读数:107 评论数:0
跳转到新版页面分类
python/Java
正文
一、简介
Spring Cache 提供了 @Cacheable 、@CachePut 、@CacheEvict 、@Caching 等注解,在方法上使用。
核心思想:当我们调用一个方法时会把该方法的参数和返回结果最为一个键值对存放在缓存中,等下次利用同样的参数来调用该方法时将不会再执行,而是直接从缓存中获取结果进行返回。
二、RedisCacheManager
1、在RedisConfig配置类加入注解@EnableCaching。
2、设置CacheManager管理类
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(300))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
在springboot2.0之后,如果你想整合redis,那么你的pom文件应该长下面这样
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
三、常用注解
1、Cacheable
表示被注解的该方法的返回结果是可以缓存的。
@Cacheable注解的属性:
(1)value:缓存名称(可以有多个)
(2)key:缓存key规则,可以使用SpringEL表达式
(3)condition:SpringEL表达式,结果为true,缓存数据到redis。结果为false,不缓存数据到redis.
//对象
@Cacheable(value = {"product"},key="#root.methodName")
//分⻚使用拼接方式
@Cacheable(value ={"product_page"},key="#root.methodName + #page+'_'+#size")
2、CachePut
写数据的方法上,比如:新增/修改方法,调用时会自动把相应的数据放入到缓存中,该注解的参数与@Cacheable注解类似
3、CacheEvict
在移除数据的方法上,比如:删除方法,调用方法时会从缓存中移除相应的数据
注意:该注解的beforelnvocation=true/false,表示缓存的清除是否是在方法前执行,默认代表缓存清除操作是在方法执行之后执行,如果出现异常的话就不会清除。
有的时候在操作一个方法的时候会涉及到多个注解的使用,这时@Caching注解就起到了作用。
@Caching(
cacheable = {@Cacheable(value ="product",keyGenerator = "xdclassKeyGenerator")},
put = {@CachePut(value ="product",key = "#id"),
@CachePut(value ="product",key = "'stock:'+#id")
}
)