1. 程式人生 > 實用技巧 >springboot 2.X 整合redis

springboot 2.X 整合redis

在實際開發中,經常會引入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來實現序列化。

@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上,需要自取。