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來實現序列化。我們可以通過自定義一個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上,需要自取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM