Springboot2.2 Redis多个实例简单的手动配置

在Springboot升级到2.0以后,Redis的配置相比于2.0之前有了特别大的变化,我也初学Springboot2.0,肯定有写得不太对的地方,希望能让阅读这篇帖子的朋友们都有所收获,本文中的springboot版本为:2.2.0.BUILD-SNAPSHOT

 在springboot2.0以后,redis的配置给我的印象主要有两种方式,一是使用standalone方式,就是传统基于jedis的配置,二是使用Lettuce方式,基于netty做的通信,为springboot2.0的新方式,推荐使用lettuce方式,经过批量set和delete的测试(直接使用RedisTemplate的delete方法和opsFor中的set方法),后者的效率比前者要高出一倍左右。

在本文中不管是standalone还是lettuce方式均使用apache的commons-pool2中提供的GenericObjectPoolConfig实例做为redis的连接池,放弃使用jedisPoolConfig。

pom中配置Redis必须要有引用:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

Spring的配置文件application.yml:

由于是手动配置多个Redis连接实例,所以必须要注意pool和redia-a/b/c下的变量名称,和springboot的auto-cofing名称有出入

spring:
  redis:
    lettuce:
      pool:
        MaxTotal: 50
        minIdle: 1
        maxWaitMillis: 5000
        maxIdle: 5
        testOnBorrow: true
        testOnReturn: true
        testWhileIdle: true
    redis-a:
      database: 0
      hostName: 192.168.0.88
      port: 6379
      timeout: 5000
    redis-b:
      database: 1
      hostName: ${spring.redis.redis-a.hostName}
      port: ${spring.redis.redis-a.port}
      timeout: ${spring.redis.redis-a.timeout}
    redis-c:
      database: 2
      hostName: ${spring.redis.redis-a.hostName}
      port: ${spring.redis.redis-a.port}
      timeout: ${spring.redis.redis-a.timeout}

standalone

standalone方式配置多个redis连接实例,在使用redis的standalone方式时,需要额外在pom中引入jedis客户端,反正我的需要,虽然我在spring-boot-starter-data-redis这个starter的pom中看到有引入jedis,但是在我的这个demo中并没有把jedis import进来

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

 

RedisTemplate的配置:

@Configuration
public class StandaloneRedisConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
    @Scope(value = "prototype")
    public GenericObjectPoolConfig redisPool(){
        return new GenericObjectPoolConfig();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.redis-a")
    public RedisStandaloneConfiguration standaloneConfigurationA() {
        return new RedisStandaloneConfiguration();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.redis-b")
    public RedisStandaloneConfiguration standaloneConfigurationB() {
        return  new RedisStandaloneConfiguration();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.redis-c")
    public RedisStandaloneConfiguration standaloneConfigurationC() {
        return new RedisStandaloneConfiguration();
    }

    @Bean
    public JedisConnectionFactory standaloneFactoryA(){
        JedisClientConfiguration poolConfig = JedisClientConfiguration.builder().usePooling().poolConfig(redisPool()).build();
        return  new JedisConnectionFactory(standaloneConfigurationA(), poolConfig);
    }

    @Bean
    public JedisConnectionFactory standaloneFactoryB(){
        JedisClientConfiguration poolConfig = JedisClientConfiguration.builder().usePooling().poolConfig(redisPool()).build();
        return new JedisConnectionFactory(standaloneConfigurationB(), poolConfig);
    }

    @Bean
    public JedisConnectionFactory standaloneFactoryC(){
        JedisClientConfiguration poolConfig = JedisClientConfiguration.builder().usePooling().poolConfig(redisPool()).build();
        return new JedisConnectionFactory(standaloneConfigurationC(), poolConfig);
    }

    @Bean
    public RedisTemplate StringRedisTemplateA(){
        RedisTemplate<String, String> template = getRedisTemplate();
        template.setConnectionFactory(standaloneFactoryA());
        return template;
    }

    @Bean
    public RedisTemplate StringRedisTemplateB(){
        RedisTemplate<String, String> template = getRedisTemplate();
        template.setConnectionFactory(standaloneFactoryB());
        return template;
    }

    @Bean
    public RedisTemplate StringRedisTemplateC(){
        RedisTemplate<String, String> template = getRedisTemplate();
        template.setConnectionFactory(standaloneFactoryC());
        return template;
    }

    private RedisTemplate<String, String> getRedisTemplate(){
        RedisTemplate<String, String> template = new RedisTemplate<>();
        template.setValueSerializer(new GenericFastJsonRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }
}

Lettuce

lettuce方式不需要在pom中引入redisClient的包

RedisTemplate配置:

@Configuration
public class LettuceRedisConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
    @Scope(value = "prototype")
    public GenericObjectPoolConfig redisPool(){
        return new GenericObjectPoolConfig();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.redis-a")
    public RedisStandaloneConfiguration redisConfigA(){
        return new RedisStandaloneConfiguration();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.redis-b")
    public RedisStandaloneConfiguration redisConfigB(){
        return new RedisStandaloneConfiguration();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis.redis-c")
    public RedisStandaloneConfiguration redisConfigC(){
        return new RedisStandaloneConfiguration();
    }

    @Bean
    @Primary
    public LettuceConnectionFactory factoryA(){
        GenericObjectPoolConfig config = redisPool();
        LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
                .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
        return new LettuceConnectionFactory(redisConfigA(), clientConfiguration);
    }

    @Bean
    public LettuceConnectionFactory factoryB(){
        GenericObjectPoolConfig config = redisPool();
        LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
                .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
        return new LettuceConnectionFactory(redisConfigB(), clientConfiguration);
    }

    @Bean
    public LettuceConnectionFactory factoryC(){
        GenericObjectPoolConfig config = redisPool();
        LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
                .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
        return new LettuceConnectionFactory(redisConfigC(), clientConfiguration);
    }

    @Bean
    public StringRedisTemplate redisTemplateA(){
        StringRedisTemplate template = getRedisTemplate();
        template.setConnectionFactory(factoryA());
        return template;
    }

    @Bean
    public StringRedisTemplate redisTemplateB(){
        StringRedisTemplate template = getRedisTemplate();
        template.setConnectionFactory(factoryB());
        return template;
    }

    @Bean
    public StringRedisTemplate redisTemplateC(){
        StringRedisTemplate template = getRedisTemplate();
        template.setConnectionFactory(factoryC());
        return template;
    }

    private StringRedisTemplate getRedisTemplate(){
        StringRedisTemplate template = new StringRedisTemplate();
        template.setValueSerializer(new GenericFastJsonRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }
}

本文只是抛砖引玉,希望大家给出修改意见

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值