springboot2.X 配置Jedis集群和单机版(基于代码配置)

目录

基于springboot 2.1.5.RELEASE,springboot2.X默认redis客户端是lettuce。本文使用的是jedis配置(建议使用lettuce)

  • jedis 轻量级 线程不安全,可以通过线程池解决安全问题
  • lettuce 基于netty实现的线程安全客户端
  • redission 分布式客户端,支持分布式的操作

引入maven

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.0</version>
        </dependency>

        <!--加载yml配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
    </dependencies>

properties单机版

  • 单机版
/**
 * 单机版properties
 * @author warApe
 * @date 2018/5/14 14:25
 */
@Data
public class JedisClientPoolProperties {

    private int maxTotal;
    private int maxIdle;
    private int maxWaitMillis;
}
/**
 * @author warApe
 * @date 2018/5/14 14:23
 */
@Data
public class JedisClientProperties {

    private int port;
    private String hostName;
    private int connectTimeout;
    private int readTimeout;

}

BeanConfig 单机版

/**
 * @program: springboot-share
 * @description: bean加载config
 * @author: warApe
 * @create: 2019-05-31 14:58
 **/
@Configuration
public class BeanConfig {

    @Bean
    @ConfigurationProperties(prefix = "com.warape.redis.standalone.pool")
    public JedisClientPoolProperties jedisClientPoolProperties() {
        return new JedisClientPoolProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "com.warape.redis.standalone.client")
    public JedisClientProperties jedisClientProperties() {
        return new JedisClientProperties();
    }
}

JedisClientConfig 配置 单机版

/**
 * redis单机版配置
 *
 * @author warApe
 * @date 2018/5/11 15:50
 * @see SpringbootShareApplication
 */
//@Profile("local")//指定运行环境
@Configuration
public class JedisClientConfig extends RedisAutoConfiguration {

    private JedisClientPoolProperties jedisClientPoolProperties;
    private JedisClientProperties jedisClientProperties;

    @Autowired
    public JedisClientConfig(JedisClientPoolProperties jedisClientPoolProperties, JedisClientProperties jedisClientProperties) {
        this.jedisClientPoolProperties = jedisClientPoolProperties;
        this.jedisClientProperties = jedisClientProperties;
    }

    /**
     * 单节点
     *
     * @return
     */
    @Bean
    public RedisConnectionFactory defaultJedisConnectionFactory() {
        //如果什么参数都不设置,默认连接本地6379端口
        RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration();
        standaloneConfiguration.setHostName(jedisClientProperties.getHostName());
        standaloneConfiguration.setPort(jedisClientProperties.getPort());


        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        //最大空闲
        genericObjectPoolConfig.setMaxIdle(jedisClientPoolProperties.getMaxIdle());
        //链接池中最大连接数
        genericObjectPoolConfig.setMaxTotal(jedisClientPoolProperties.getMaxTotal());
        //最小空闲
        genericObjectPoolConfig.setMinIdle(jedisClientPoolProperties.getMaxIdle());
        //连接池资源耗尽后  最大等待时间
        genericObjectPoolConfig.setMaxWaitMillis(jedisClientPoolProperties.getMaxWaitMillis());

        JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder()
                .connectTimeout(Duration.ofMillis(jedisClientProperties.getConnectTimeout()))
                .readTimeout(Duration.ofMillis(jedisClientProperties.getReadTimeout()))
                .usePooling().poolConfig(genericObjectPoolConfig)
                .build();


        return new JedisConnectionFactory(standaloneConfiguration, jedisClientConfiguration);
    }

    @Bean
    public RedisTemplate<String, Object> defaultRedisTemplate(RedisConnectionFactory defaultJedisConnectionFactory) {
        //创建一个模板类
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        //将刚才的redis连接工厂设置到模板类中
        template.setConnectionFactory(defaultJedisConnectionFactory);
        StringRedisSerializer hashKeySerializer = new StringRedisSerializer();
        template.setKeySerializer(hashKeySerializer);
        template.setHashKeySerializer(hashKeySerializer);
        return template;
    }

    @Bean
    public StringRedisTemplate defaultStringRedisTemplate(RedisConnectionFactory defaultJedisConnectionFactory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(defaultJedisConnectionFactory);
        return stringRedisTemplate;
    }

    /**
     * 序列化不同(对象)
     *
     * @param defaultRedisTemplate
     * @return
     */
    @Bean
    public RedisUtil defaultRedisUtil(RedisTemplate<String, Object> defaultRedisTemplate) {
        return new RedisUtil(defaultRedisTemplate);
    }

    /**
     * (可视的数据)
     *
     * @param defaultStringRedisTemplate
     * @return
     */
    @Bean
    public StringTemplateRedisUtil defaultStringTemplateRedisUtil(StringRedisTemplate defaultStringRedisTemplate) {
        return new StringTemplateRedisUtil(defaultStringRedisTemplate);
    }

}

单机版 yml配置

  #单机版配置
com:
  warape:
   redis:
     standalone:
       client:
         host-name: 10.20.29.71
         port: 6379
         connectTimeout: 2000
         readTimeout: 1000
       pool:
         max-total: 100
         max-idle: 10
         max-wait-millis: 1000

properties 集群版

/**
 * Jedis集群配置类
 *
 * @author warApe
 */
@Data
public class JedisClusterConfigProperties {
    private int connectTimeout;
    private int readTimeout;
    private int maxRedirections;
    private List<String> jedisClusterNodes;
}

/**
 * @author warApe
 * @date 2018/5/14 14:25
 */
@Data
public class JedisClusterPoolProperties {

    private int maxTotal;
    private int maxIdle;
    private int maxWaitMillis;
}

BeanConfig 集群版

/**
 * @program: springboot-share
 * @description: bean加载config
 * @author: warApe
 * @create: 2019-05-31 14:58
 **/
@Configuration
public class BeanConfig {

    @Bean
    @ConfigurationProperties(prefix = "com.warape.redis.pool")
    public JedisClusterPoolProperties jedisClusterPoolProperties() {
        return new JedisClusterPoolProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "com.warape.redis.cluster")
    public JedisClusterConfigProperties jedisClusterConfigProperties() {
        return new JedisClusterConfigProperties();
    }


}

JedisClientConfig 配置 集群版

package com.warape.springbootshare.integrated.configs;

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import com.warape.springbootshare.SpringbootShareApplication;
import com.warape.springbootshare.integrated.properties.JedisClusterConfigProperties;
import com.warape.springbootshare.integrated.properties.JedisClusterPoolProperties;
import com.warape.springbootshare.integrated.utils.RedisUtil;
import com.warape.springbootshare.integrated.utils.StringTemplateRedisUtil;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * 集群版
 *
 * @author warApe
 * @date 2018/7/29 18:03
 * @see SpringbootShareApplication @EnableRedisConfigType
 */
//@Profile({"dev","pro"})
public class JedisClusterConfig {

    private JedisClusterPoolProperties jedisClusterPoolProperties;
    private JedisClusterConfigProperties JedisClusterConfigProperties;

    @Autowired
    public JedisClusterConfig(JedisClusterPoolProperties jedisClusterPoolProperties, JedisClusterConfigProperties jedisClusterConfigProperties) {
        this.jedisClusterPoolProperties = jedisClusterPoolProperties;
        JedisClusterConfigProperties = jedisClusterConfigProperties;
    }

    @Bean
    public RedisConnectionFactory jedisConnectionFactoryCluster1() {

        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(JedisClusterConfigProperties.getJedisClusterNodes());
        redisClusterConfiguration.setMaxRedirects(JedisClusterConfigProperties.getMaxRedirections());
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        //最大空闲
        genericObjectPoolConfig.setMaxIdle(jedisClusterPoolProperties.getMaxIdle());
        //链接池中最大连接数
        genericObjectPoolConfig.setMaxTotal(jedisClusterPoolProperties.getMaxTotal());
        //最小空闲
        genericObjectPoolConfig.setMinIdle(jedisClusterPoolProperties.getMaxIdle());
        //连接池资源耗尽后  最大等待时间
        genericObjectPoolConfig.setMaxWaitMillis(jedisClusterPoolProperties.getMaxWaitMillis());

        JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder()
                .connectTimeout(Duration.ofMillis(JedisClusterConfigProperties.getConnectTimeout()))
                .readTimeout(Duration.ofMillis(JedisClusterConfigProperties.getReadTimeout()))
                .usePooling().poolConfig(genericObjectPoolConfig)
                .build();
        return new JedisConnectionFactory(redisClusterConfiguration, jedisClientConfiguration);
    }

    /**
     * redisClusterTemplateCluster1
     *
     * @param jedisConnectionFactoryCluster1 参数名为beanName
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisClusterTemplateCluster1(RedisConnectionFactory jedisConnectionFactoryCluster1) {
        //创建一个模板类
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        //将刚才的redis连接工厂设置到模板类中
        template.setConnectionFactory(jedisConnectionFactoryCluster1);
        //初始化redis key中的序列化方式 StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        //初始化redis value中的序列化方式 fastjson序列化
        GenericFastJsonRedisSerializer serializer = new GenericFastJsonRedisSerializer();
        template.setHashValueSerializer(serializer);
        template.setValueSerializer(serializer);
        return template;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplateCluster1(RedisConnectionFactory jedisConnectionFactoryCluster1) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(jedisConnectionFactoryCluster1);
        return stringRedisTemplate;
    }

    /**
     * 序列化不同(对象)
     *
     * @param redisClusterTemplateCluster1
     * @return
     */
    @Bean
    public RedisUtil redisUtilCluster1(RedisTemplate<String, Object> redisClusterTemplateCluster1) {
        return new RedisUtil(redisClusterTemplateCluster1);
    }


    /**
     * (可视的数据)
     *
     * @param stringRedisTemplateCluster1
     * @return
     */
    @Bean
    public StringTemplateRedisUtil StringRedisUtilCluster1(StringRedisTemplate stringRedisTemplateCluster1) {
        return new StringTemplateRedisUtil(stringRedisTemplateCluster1);
    }


}

集群yml配置

#集群版配置
com:
  warape:
    redis:
      pool:
        maxTotal: 100
        maxIdle: 10
        maxWaitMillis: 3000
      cluster:
        connectTimeout: 2000
        readTimeout: 1000
        maxRedirections: 5
        jedisClusterNodes: 10.143.131.63:6391,10.143.131.63:6392,10.143.131.63:6393,10.143.131.63:6394,10.143.131.63:6395,10.143.131.63:6396
      #如果为多个集群 一次类推
#      cluster1:
#        connectTimeout:
#        readTimeout:
#        maxRedirections:
#        jedisClusterNodes:
#      pool1:
#        maxTotal: 100
#        maxIdle: 10
#        maxWaitMillis: 3000



注:

有2个工具类我没有贴出来,太长了,请小伙伴们去github上去找一下
分别为:StringTemplateRedisUtil 和 RedisUtil

项目github地址:

https://github.com/warApePoint/springboot-share

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿道apeto

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值