添加Redis依赖
org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2
配置文件:
spring:
redis:
timeout: 0
#Redis服务器地址
host: 127.0.0.1
#Redis服务器连接端口
port: 6379
#Redis服务器连接密码(默认为空)
password:
cache:
redis:
time-to-live: 60000
自定义RedisTemplate
@Bean
@Primary
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
template.setDefaultSerializer(genericJackson2JsonRedisSerializer());
return template;
}
private RedisSerializer
后续使用RedisTemplate
使用注解进行缓存操作涉及CacheManage
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisConnectionFactory.class)
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class RedisCacheConfiguration {
@Bean
RedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,
ObjectProvider redisCacheConfiguration,
ObjectProvider redisCacheManagerBuilderCustomizers,
RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(
determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));
List cacheNames = cacheProperties.getCacheNames();
if (!cacheNames.isEmpty()) {
builder.initialCacheNames(new linkedHashSet<>(cacheNames));
}
redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return cacheManagerCustomizers.customize(builder.build());
}
}
RedisCacheConfiguration 会注入一个RedisCacheManager ,内部使用JDK序列化;如果想使用自己定义的序列化方式,可以提供一个RedisCacheConfiguration bean,或者实现RedisCacheManagerBuilderCustomizer接口,对RedisCacheManagerBuilder进行更改;
提供RedisCacheConfiguration bean
@Bean
public RedisCacheConfiguration determineConfiguration(CacheProperties cacheProperties) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
// 设置redis中值的序列化方式,方便redisClient可读
config = config.serializevaluesWith(SerializationPair.fromSerializer(jackson2JsonRedisSerializer()));
Redis redisProperties = cacheProperties.getRedis();
if (redisProperties.getTimeToLive() != null) {
config = config.entryTtl(redisProperties.getTimeToLive());
}
if (redisProperties.getKeyPrefix() != null) {
config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
}
if (!redisProperties.isCacheNullValues()) {
config = config.disableCachingNullValues();
}
if (!redisProperties.isUseKeyPrefix()) {
config = config.disableKeyPrefix();
}
return config;
}
private RedisSerializer jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(
Object.class);
jackson2JsonRedisSerializer.setObjectMapper(buildMapper());
return jackson2JsonRedisSerializer;
}
private ObjectMapper buildMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//设置类型
objectMapper.activateDefaultTyping(LaissezFaireSubTypevalidator.instance, ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY);
Set registeredModuleIds = objectMapper.getRegisteredModuleIds();
registeredModuleIds.forEach(System.out::println);
objectMapper.registerModule(new JavaTimeModule());
//忽略null值
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return objectMapper;
}
spring-boot-starter-data-redis 会使用RedisAutoConfiguration自动配置:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
//属性配置
@EnableConfigurationProperties(RedisProperties.class)
//连接配置
@import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration{
......
}
2.x版本默认使用lettuce作为客户端;
连接池pool虽然有默认值,但是并不会启用
public static class Pool {
private int maxIdle = 8;
private int minIdle = 0;
@Bean @ConditionalOnMissingBean(RedisConnectionFactory.class) LettuceConnectionFactory redisConnectionFactory( ObjectProviderbuilderCustomizers, ClientResources clientResources) throws UnknownHostException { //这里的getPool会是null,需要在yml设置一个pool属性才会创建pool对象 LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources, getProperties().getLettuce().getPool()); return createLettuceConnectionFactory(clientConfig); }



