[Quick Start]RedisTemplate的bean手动配置

  created  by  鱼鱼 {{tag}}
创建于 2020年02月20日 00:00:43 最后修改于 2020年02月24日 18:17:24

    有时我们可能需要手动配置Redis的连接,例如动态修改或是从特殊的参数中获取,而不是使用SpringBoot的自有配置,此篇文章意在快速指引redis的手动配置。基于Spring项目和Jedis的底层,使用RedisTemplate;

引入相关依赖

    通过Maven引入相关依赖,可以的话spring-data-redis选择2.0.0以上版本,较低版本需要的依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

<!--引入org.springframework.boot.spring-boot-starter-data-redis也可以 但是无法使用Lettuce-->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.0.5</version>
</dependency>

    如果使用了Spring-boot并且要使用较高的版本(例如在2.1.0后才有的某些API-putIfAbsent带有超时时间的版本),我们直接修改starter的版本是不够的,二者版本并不对称,我们需要去掉其中的redis依赖并单独引入。建议保持良好的依赖管理习惯,显式的移除依赖,而不是任其覆盖,如:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.2.0.RELEASE</version>
    <!-- 实际的此依赖版本是2.0.5 API较旧所以移除 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

直接使用配置文件

    毕竟SpringBoot都为我们准备好了,如果配置文件可以解决问题,可以直接配置:

 applicaion.yml

redis:
  database: 0
  pool:
    max-active: 1000
    max-wait: -1
    max-idle: 20
  #主从配置
  # sentinel:
  # master: master
  # nodes: 10.0.0.2:6379,,10.0.0.3:6379
  host: 10.0.0.1
  port: 6379
  password: "xxx"

bean配置类(Spring-data-redis >= v2.0)

    在2.0之后的版本的ConnectionFactory中标注了一些方法过时,例如配置Redis连接池的类,建议使用新的配置类替换,以下是一个从环境变量中读取相关redis连接的配置方式:

@Configuration
public class RedisConfig {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Bean
    public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPool,
                                  RedisStandaloneConfiguration jedisConfig) {
        //配置使用连接池,如果用默认的连接池策略直接builder.build()即可
        JedisClientConfiguration jedisClientConfiguration = 
            JedisClientConfiguration.builder().usePooling().poolConfig(jedisPool).build();
        return new JedisConnectionFactory(jedisConfig, jedisClientConfiguration);
    }
    /**
      * 定义redis连接池参数,详细参数配置请查阅资料
     * */
    @Bean
    public JedisPoolConfig jedisPool() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(100);
        jedisPoolConfig.setMaxWaitMillis(1000);
        jedisPoolConfig.setMaxTotal(100);
        jedisPoolConfig.setMinIdle(10);
        return jedisPoolConfig;
    }

    /**
     * 配置Redis的连接,从系统环境变量中取值
     *  使用单机部署配置
     * */
    @Bean
    public RedisStandaloneConfiguration jedisConfig() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        int port=(null==System.getenv("REDIS_PORT")?6379:new Integer(System.getenv("REDIS_PORT")));
        String hostName=(null==System.getenv("REDIS_HOST")?"127.0.0.1":System.getenv("REDIS_HOST"));
        String password=(null==System.getenv("REDIS_PSWD")?null:System.getenv("REDIS_PSWD"));
        logger.info("Init redis connection - port:{},host:{}",port,hostName);
        config.setHostName(hostName);
        config.setPort(port);
        config.setDatabase(0);
        config.setPassword(RedisPassword.of(password));
        return config;
    }


    /**
     *    此处配置了处理字符串的StringRedisTemplate,如果也需要RedisTemplate,按需配置
     * */        
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        //do more...        还可以定义一些诸如序列化的配置 
        //Configuration不需要显式的调用,但是如果你是作为一个Util类,需要调用这个方法后才可以使用 
        //stringRedisTemplate.afterPropertiesSet();        
        return stringRedisTemplate;
    }
}

    这样直接注入SpringRedisTemplate相应的bean就可以应用配置了。

bean配置类(Spring-data-redis < v2.0)

    在低版本中没有RedisStandaloneConfiguration这样的配置,JedisPool的配置也有所不同,可省略RedisStandaloneConfiguration,其余方法不变:

@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPool) {
    JedisConnectionFactory jedisConnectionFactory=new JedisConnectionFactory();
    jedisConnectionFactory.setUsePool(true);
    jedisConnectionFactory.setPoolConfig(jedisPool);
    jedisConnectionFactory.setHostName();
    jedisConnectionFactory.setPassword();
    jedisConnectionFactory.setDatabase();
    jedisConnectionFactory.setPort();
    return jedisConnectionFactory;
}


评论区
评论
{{comment.creator}}
{{comment.createTime}} {{comment.index}}楼
评论

[Quick Start]RedisTemplate的bean手动配置

[Quick Start]RedisTemplate的bean手动配置

    有时我们可能需要手动配置Redis的连接,例如动态修改或是从特殊的参数中获取,而不是使用SpringBoot的自有配置,此篇文章意在快速指引redis的手动配置。基于Spring项目和Jedis的底层,使用RedisTemplate;

引入相关依赖

    通过Maven引入相关依赖,可以的话spring-data-redis选择2.0.0以上版本,较低版本需要的依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

<!--引入org.springframework.boot.spring-boot-starter-data-redis也可以 但是无法使用Lettuce-->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.0.5</version>
</dependency>

    如果使用了Spring-boot并且要使用较高的版本(例如在2.1.0后才有的某些API-putIfAbsent带有超时时间的版本),我们直接修改starter的版本是不够的,二者版本并不对称,我们需要去掉其中的redis依赖并单独引入。建议保持良好的依赖管理习惯,显式的移除依赖,而不是任其覆盖,如:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.2.0.RELEASE</version>
    <!-- 实际的此依赖版本是2.0.5 API较旧所以移除 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

直接使用配置文件

    毕竟SpringBoot都为我们准备好了,如果配置文件可以解决问题,可以直接配置:

 applicaion.yml

redis:
  database: 0
  pool:
    max-active: 1000
    max-wait: -1
    max-idle: 20
  #主从配置
  # sentinel:
  # master: master
  # nodes: 10.0.0.2:6379,,10.0.0.3:6379
  host: 10.0.0.1
  port: 6379
  password: "xxx"

bean配置类(Spring-data-redis >= v2.0)

    在2.0之后的版本的ConnectionFactory中标注了一些方法过时,例如配置Redis连接池的类,建议使用新的配置类替换,以下是一个从环境变量中读取相关redis连接的配置方式:

@Configuration
public class RedisConfig {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Bean
    public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPool,
                                  RedisStandaloneConfiguration jedisConfig) {
        //配置使用连接池,如果用默认的连接池策略直接builder.build()即可
        JedisClientConfiguration jedisClientConfiguration = 
            JedisClientConfiguration.builder().usePooling().poolConfig(jedisPool).build();
        return new JedisConnectionFactory(jedisConfig, jedisClientConfiguration);
    }
    /**
      * 定义redis连接池参数,详细参数配置请查阅资料
     * */
    @Bean
    public JedisPoolConfig jedisPool() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(100);
        jedisPoolConfig.setMaxWaitMillis(1000);
        jedisPoolConfig.setMaxTotal(100);
        jedisPoolConfig.setMinIdle(10);
        return jedisPoolConfig;
    }

    /**
     * 配置Redis的连接,从系统环境变量中取值
     *  使用单机部署配置
     * */
    @Bean
    public RedisStandaloneConfiguration jedisConfig() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        int port=(null==System.getenv("REDIS_PORT")?6379:new Integer(System.getenv("REDIS_PORT")));
        String hostName=(null==System.getenv("REDIS_HOST")?"127.0.0.1":System.getenv("REDIS_HOST"));
        String password=(null==System.getenv("REDIS_PSWD")?null:System.getenv("REDIS_PSWD"));
        logger.info("Init redis connection - port:{},host:{}",port,hostName);
        config.setHostName(hostName);
        config.setPort(port);
        config.setDatabase(0);
        config.setPassword(RedisPassword.of(password));
        return config;
    }


    /**
     *    此处配置了处理字符串的StringRedisTemplate,如果也需要RedisTemplate,按需配置
     * */        
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        //do more...        还可以定义一些诸如序列化的配置 
        //Configuration不需要显式的调用,但是如果你是作为一个Util类,需要调用这个方法后才可以使用 
        //stringRedisTemplate.afterPropertiesSet();        
        return stringRedisTemplate;
    }
}

    这样直接注入SpringRedisTemplate相应的bean就可以应用配置了。

bean配置类(Spring-data-redis < v2.0)

    在低版本中没有RedisStandaloneConfiguration这样的配置,JedisPool的配置也有所不同,可省略RedisStandaloneConfiguration,其余方法不变:

@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPool) {
    JedisConnectionFactory jedisConnectionFactory=new JedisConnectionFactory();
    jedisConnectionFactory.setUsePool(true);
    jedisConnectionFactory.setPoolConfig(jedisPool);
    jedisConnectionFactory.setHostName();
    jedisConnectionFactory.setPassword();
    jedisConnectionFactory.setDatabase();
    jedisConnectionFactory.setPort();
    return jedisConnectionFactory;
}



[Quick Start]RedisTemplate的bean手动配置 2020-02-24鱼鱼

{{commentTitle}}

评论   ctrl+Enter 发送评论