Redisson 三种集群部署模式使用

不同 Redis 集群部署模式 Redisson 连接不同

Redis 常见四种部署模式:单机部署、主从模式部署、sentinel 部署模式、分片模式,针对不同场景一般选择不同的集群部署模式。而 redisson 单机部署针对不同的部署模式分别提供了不同的 API 以统一操作。

Redisson连接兼容多种部署模式

添加依赖

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.13.4</version>
</dependency>

yaml 配置

redis:
  server:
    model: 2 #1 表示单机,2 表示sentinel, 3表示cluster
    key-prefix: ${spring.application.name}
    singleton: 
      hostName: redis
      port: ${port}
      password: ${password}
    sentinel:
      nodes: ${ip1:port1},${ip2:port1},${ip3:port1}
      master: redismaster
      password: ${password}
    cluster:
      nodes: ${ip1:port1},${ip2:port1},${ip3:port1}
      maxRedirects: 5 

读取配置类

@Configuration
@ConfigurationProperties("redis.server")
@Data
public class RedisConfig {

  private Integer model;
  private String keyPrefix;
  private RSingleton singleton;
  private RSentinel sentinel;
  private RCluster cluster;

  @Data
  static class RSingleton {
    private String hostName;
    private Integer port;
    private String password;
  }

  @Data
  static class RSentinel {
    private String[] nodes;
    private String master;
    private String password;
  }

  @Data
  static class RCluster {
    private String[] nodes;
    private Integer maxRedirects;
  }
}

Redisson 支持 Redis 单机部署

// 单机模式
String address =
    REDIS_PROTO + redisConfig.getSingleton().getHostName() + ":" + redisConfig.getSingleton()
        .getPort();
SingleServerConfig serverConfig = config.useSingleServer();
serverConfig.setAddress(address);
if (!StringUtils.isEmpty(redisConfig.getSingleton().getPassword())) {
  serverConfig.setPassword(redisConfig.getSingleton().getPassword());
}
return Redisson.create(config);

Redisson 支持 Redis sentinel 部署模式

String[] nodes = redisConfig.getSentinel().getNodes();
for (int i = 0; i < nodes.length; i++) {
  nodes[i] = REDIS_PROTO + nodes[i];
}
SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
sentinelServersConfig.setMasterName(redisConfig.getSentinel().getMaster());
sentinelServersConfig.addSentinelAddress(nodes);

if (StringUtils.isNotBlank(redisConfig.getSentinel().getPassword())) {
  sentinelServersConfig.setPassword(redisConfig.getSentinel().getPassword());
}

return Redisson.create(config);

Redisson 支持 Redis 分片部署模式

String[] nodes = redisConfig.getCluster().getNodes();
for (int i = 0; i < nodes.length; i++) {
  nodes[i] = REDIS_PROTO + nodes[i];
}
ClusterServersConfig clusterServersConfig = config.useClusterServers();
clusterServersConfig.addNodeAddress(nodes);
return Redisson.create(config);

多种模式支持

@Slf4j
@Component
public class RedissonConfig {

  @Autowired
  private RedisConfig redisConfig;

  private static final String REDIS_PROTO = "redis://";

  @Bean
  public RedissonClient getRedissonClient() {
    Config config = new Config();
    if (redisConfig.getModel() == 2) {
      // sentinel模式
      String[] nodes = redisConfig.getSentinel().getNodes();
      for (int i = 0; i < nodes.length; i++) {
        nodes[i] = REDIS_PROTO + nodes[i];
      }
      SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
      sentinelServersConfig.setMasterName(redisConfig.getSentinel().getMaster());
      sentinelServersConfig.addSentinelAddress(nodes);

      if (StringUtils.isNotBlank(redisConfig.getSentinel().getPassword())) {
        sentinelServersConfig.setPassword(redisConfig.getSentinel().getPassword());
      }

      return Redisson.create(config);
    } else if (redisConfig.getModel() == 3) {
      // 集群模式
      String[] nodes = redisConfig.getCluster().getNodes();
      for (int i = 0; i < nodes.length; i++) {
        nodes[i] = REDIS_PROTO + nodes[i];
      }
      ClusterServersConfig clusterServersConfig = config.useClusterServers();
      clusterServersConfig.addNodeAddress(nodes);
      return Redisson.create(config);
    } else {
      // 单机模式
      String address =
          REDIS_PROTO + redisConfig.getSingleton().getHostName() + ":" + redisConfig.getSingleton()
              .getPort();
      SingleServerConfig serverConfig = config.useSingleServer();
      serverConfig.setAddress(address);
      if (!StringUtils.isEmpty(redisConfig.getSingleton().getPassword())) {
        serverConfig.setPassword(redisConfig.getSingleton().getPassword());
      }
      return Redisson.create(config);
    }
  }
}

Redisson 分布式锁的使用

RestController
@RequestMapping("/redis")
@Slf4j
public class RedisLockController {
  @Autowired
  private RedissonClient redissonClient;
  private String NAMESPACE = "node-install-app:";

  @GetMapping("/lock/{clientid}")
  public String lock(@PathVariable String clientid) throws InterruptedException {
    String name = NAMESPACE + "hello";
    RLock hello = redissonClient.getLock(name);
    boolean b = hello.tryLock();
    if (!b) {
      log.info(clientid + "获取不到锁gg");
      return clientid + "获取不到锁gg";
    }
    try {
      log.info(clientid + "执行业务");
      Thread.sleep(20000);
    } finally {
      hello.unlock();
    }
    log.info(clientid + "执行完成");
    return clientid + "执行完成";
  }
}

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值