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: ehcacheehcache: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: redisxxxredis:host: 127.0.0.1port: 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 {@Beanpublic RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer() {return (builder) -> builder.withCacheConfiguration("cache1", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10))).withCacheConfiguration("cache2", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)));}}
SpringBoot常用套路,你如果定义了CacheManage的话,就用你的。比如:
@Beanpublic 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: redisxxx
只需要指定redis配置即可。
