java 连接redis 4中模式 单机 主从 哨兵 集群


import cn.hutool.core.util.StrUtil;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.*;
import org.redisson.spring.data.connection.RedissonConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

@Configuration
public class RedissonConfig {

  @Value("${spring.data.redis.mode:single}")
  private String mode;

  @Value("${spring.data.redis.host:localhost}")
  private String host;

  @Value("${spring.data.redis.port:6379}")
  private Integer port;

  @Value("${spring.data.redis.password:}")
  private String password;

  @Value("${spring.data.redis.database:0}")
  private Integer database;

  @Value("${spring.data.redis.timeout:10000}")
  private int timeout;

  @Value("${spring.data.redis.connection:100}")
  private int connectionPoolSize;

  @Value("${spring.data.redis.idle-timeout:10000}")
  private int idleTimeout;

  @Value("${spring.data.redis.master-name:mymaster-test}")
  private String masterName;

  @Value("${spring.data.redis.readmode:SLAVE}")
  private String readMode;

  @Value("${spring.data.redis.slaveHost:}")
  private String slaveHost;

  @Value("${spring.data.redis.ping-connection-interval:10000}")
  private int pingConnectionInterval;

  @Value("${spring.data.redis.transportMode:NIO}")
  private String transportMode;

  private static String redisPre = "redis://";

  @Bean(name = "redisTemplate")
  @Primary
  public RedisTemplate<?, ?> redisTemplate() {
    RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redissonConnectionFactory());

    //setup key serieler rule
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setKeySerializer(new StringRedisSerializer());

    return redisTemplate;
  }

  private RedisConnectionFactory redissonConnectionFactory() {
    return new RedissonConnectionFactory(redissonClient());
  }


  @Bean
  public RedissonClient redissonClient() {
    Config config = new Config();
    config.setTransportMode(TransportMode.valueOf(transportMode));
    BaseConfig<?> baseConfig;
    if ("cluster".equals(mode)) {
      ClusterServersConfig clusterServersConfig = config.useClusterServers();
      clusterServersConfig.setNodeAddresses(hostConvertRedisHost(host));
      clusterServersConfig.setScanInterval(2000);
      baseConfig = clusterServersConfig;
    } else if ("sentinel".equals(mode)) {
      SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
      sentinelServersConfig.setSentinelAddresses(hostConvertRedisHost(host));
      sentinelServersConfig.setMasterName(masterName);
      sentinelServersConfig.setDatabase(database);
      sentinelServersConfig.setMasterConnectionPoolSize(connectionPoolSize);
      sentinelServersConfig.setSlaveConnectionPoolSize(connectionPoolSize);
      sentinelServersConfig.setReadMode(ReadMode.valueOf(readMode));
      baseConfig = sentinelServersConfig;
    } else if("master".equals(mode)){
      MasterSlaveServersConfig masterSlaveServersConfig = config.useMasterSlaveServers();
      masterSlaveServersConfig.setDatabase(database);
      masterSlaveServersConfig.setMasterAddress(formatAddress(host, port));
      masterSlaveServersConfig.setSlaveAddresses(Set.copyOf(hostConvertRedisHost(slaveHost)));
      masterSlaveServersConfig.setMasterConnectionPoolSize(connectionPoolSize);
      masterSlaveServersConfig.setSlaveConnectionPoolSize(connectionPoolSize);
      masterSlaveServersConfig.setReadMode(ReadMode.valueOf(readMode));
      baseConfig = masterSlaveServersConfig;
    }else {
      SingleServerConfig singleServerConfig = config.useSingleServer();
      singleServerConfig.setAddress(formatAddress(host, port));
      singleServerConfig.setDatabase(database);
      baseConfig = singleServerConfig;
    }
    if (!password.isBlank()) {
      baseConfig.setPassword(password);
    }
    baseConfig.setTimeout(timeout);
    baseConfig.setPingConnectionInterval(pingConnectionInterval);
    baseConfig.setIdleConnectionTimeout(idleTimeout);
    return Redisson.create(config);
  }

  private static String formatAddress(String host, int port) {
    return redisPre + host + ":" + port;
  }

  private List<String> hostConvertRedisHost(String host){
    if(StrUtil.isBlank(host)){
      return Collections.emptyList();
    }
    String[] singleHosts = host.split(";");
    List<String> hostList = new ArrayList<>(singleHosts.length);
    for (String singleHost : singleHosts) {
      String address = formatAddress(singleHost, port);
      hostList.add(address);
    }
    return hostList;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值