1.简介
本篇文章是阅读官方文档的一个随手笔记。介绍了SpringBoot官方文档中关于Caching的介绍。说到缓存我们首先想到的就是Redis,但是缓存并不局限于Redis一种。于是SpringFramework 提供了一种通用的注解方式,无须关心其具体的缓存实现。
2.SpringBoot默认的Cache实现
SpringBoot提供了缓存的开箱即用特性,只需要引入spring-boot-starter-cache
依赖即可,默认的实现就是用concurrent maps
,如果你想去选择缓存的具体实现的话,有两种方式可以选择
- 显式的配置
通过配置文件中
sspring.cache.type
配置项来指定3.各种缓存的使用方式(简单)
这里我仅仅整合Redis和EhCache2.X,因为这两个缓存听说过,其他的都没用过。
3.1EhCache2.X
1.编写EhCache的Xml配置文件
略
2.导入EhCache的依赖<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
3.配置EhCache
spring:
cache:
type: ehcache
ehcache:
config: "classpath:ehcache.xml"
3.2Redis
1.引入redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
这个不需要引入spring-boot-starter-cache
2.配置文件
spring:
cache:
type: redis
xxx
redis:
host: 127.0.0.1
port: 6379
4.通过代码配置
其他缓存的配置方式与上面的配置方式一致。下面来说一下使用代码配置缓存。
在官方文档中说明了,通过上面简单写配置文件这种方式配置后,如果想对其配置进行修改。可以用以下方式:
import java.time.Duration;
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
@Configuration(proxyBeanMethods = false)
public class MyRedisCacheManagerConfiguration {
@Bean
public RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer() {
return (builder) -> builder
.withCacheConfiguration("cache1", RedisCacheConfiguration
.defaultCacheConfig().entryTtl(Duration.ofSeconds(10)))
.withCacheConfiguration("cache2", RedisCacheConfiguration
.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)));
}
}
SpringBoot常用套路,你如果定义了CacheManage的话,就用你的。比如:
@Bean
public CacheManager cacheManager(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);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
这样的方式,你都不需要指定如下配置:
spring:
cache:
type: redis
xxx
只需要指定redis配置即可。