在實際開發中,經常會引入redis中間件做緩存,這里介紹springboot2.X后如何配置redis
1 Maven中引入redis
springboot官方通過spring-boot-autoconfigure和redis的starter包來簡化我們的配置工作。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2 yml中配置redis參數
springboot2.x后默認使用Lettuce,Lettuce的連接是基於netty的,滿足多線程下的並發訪問,也可以使用jedis,但是jedis在多線程下線程不安全,需要使用連接池。
2.1 Lettuce配置
spring:
#redis基礎配置
redis:
host: 127.0.0.1
port: 6379
timeout: 3000
database: 1
password:
#lettuce連接池配置
lettuce:
pool:
min-idle: 0
max-idle: 5
max-active: 8
max-wait: -1
3 自定義RedisTemplate
springboot中默認提供了RedisTemplate<K,V>和StringRedisTemplate,RedisTemplate中默認使用JdkSerializationRedisSerializer來實現序列化,是通過字節數組來保存數據,
StringRedisTemplate是繼承了RedisTemplate,默認使用StringRedisSerializer來實現序列化。我們可以通過自定義一個RedisTemplate<String, Object>,方便項目中使用。
@Configuration
public class LettuceRedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
到這里就配置完成了,我們就可以使用RedisTemplate<String, Object>來操作redis。
2.2 yml配置jedis
spring:
#redis基礎配置
redis:
host: 127.0.0.1
port: 6379
timeout: 3000
database: 1
password:
#jedis 連接池配置
jedis:
pool:
# 連接池中的最小空閑連接 默認 0
min-idle: 0
# 連接池中的最大空閑連接 默認 8
max-idle: 5
# 連接池最大連接數(使用負值表示沒有限制) 默認 8
max-active: 8
# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
max-wait: -1
3.jedis配置
/**
* 連接池配置信息
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大連接數
jedisPoolConfig.setMaxTotal(maxActive);
// 當池內沒有可用連接時,最大等待時間
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 最大空閑連接數
jedisPoolConfig.setMinIdle(maxIdle);
// 最小空閑連接數
jedisPoolConfig.setMinIdle(minIdle);
// 其他屬性可以自行添加
return jedisPoolConfig;
}
/**
* Jedis 連接
*
* @param jedisPoolConfig
* @return
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling()
.poolConfig(jedisPoolConfig).and().readTimeout(Duration.ofMillis(timeout)).build();
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
redisStandaloneConfiguration.setDatabase(database);
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));
//開啟事務,默認關閉,不涉及redis事務就不要開啟,可能導致獲取錯誤的存儲信息
//redisTemplate.setEnableTransactionSupport(true);
return redisTemplate;
}
到這里就配置完成了,我們就可以使用RedisTemplate<String, Object>來操作redis。
實際開發中可以根據實際應用和熟悉程度來選擇Jedis和Lettuce,
Jedis和Lettuce相關配置代碼和單元測試代碼已經提交到git上,需要自取。