前言
最新的SpringBoot的相關Starter很多已經(jīng)省略掉了自定義的@Configuration類粮坞,取而代之的是直接在application.yml文件中直接配置,比如Druid現(xiàn)在只需要maven引入其starter并在application.yml文件配置一下就可以了。今天要說的redis也是這樣的。
究其原因為什么呢?
因為maven引入的starter里面已經(jīng)有寫好的Configuration了,相當于這個工作Starter已經(jīng)幫我們做好了粗蔚,打開你的ide,直接查看源碼
package org.springframework.boot.autoconfigure.data.redis;
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
}
package org.springframework.boot.autoconfigure.data.redis;
import java.time.Duration;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Configuration properties for Redis.
*
* @author Dave Syer
* @author Christoph Strobl
* @author Eddú Meléndez
* @author Marco Aust
* @author Mark Paluch
* @author Stephane Nicoll
*/
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
}
1捉貌、配置Redis
step1
配置application.yml文件支鸡,這些屬性都可以在上面兩個源碼類里面得到解析,這里使用了lettuce而不是jedis趁窃,前者線程池是線程安全的牧挣,這個后期再做解釋。
#redis配置醒陆,此處使用lettuce
redis:
timeout: 5000ms
password: 密碼
database: 0
sentinel:
nodes: 172.13.37.84:26379,177.15.33.82:26379,172.46.36.82:26379,172.11.31.36:26379,172.14.76.57:26379
master: master
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
step2
沒有step2了瀑构,上面就配置完了。
開玩笑的,上面配置完只能使用StringRedisTemplate寺晌,使用其他類型的RedisTemplate還需要配置序列化
@Configuration
public class RedisConfig {
@Bean
public <T> RedisTemplate<String, T> redisTemplateKeyString(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, T> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**配置其他類型的redisTemplate***/
@Bean
public RedisTemplate<Object, Object> redisTemplateKeyObject(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}