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

posted @ 2020-06-22 17:01  homeSicker  阅读(2087)  评论(0编辑  收藏  举报