public MSRedisClient(RedisConnection masterConnection, List<RedisConnection> slaveConnections) {
    this.masterConnection = masterConnection;
    this.slaveConnections = slaveConnections;
    master = new SyncRedisClient(masterConnection);
    virtualSlaves = new CopyOnWriteArrayList<RedisClient>();
    slaves = new LinkedBlockingQueue<RedisClient>(slaveConnections.size());
    StringBuilder builder = new StringBuilder();
    builder.append(String.format("%s|%s", masterConnection.address, masterConnection.db));
    for (final RedisConnection connection : slaveConnections) {
      final RedisClient redisClient = new SyncRedisClient(connection);

      slaves.add(redisClient);
      builder.append(";").append(String.format("%s|%s", connection.address, connection.db));
      // 根据权重将slave node放到虚拟节点中,权重高的放的越多。被访问的次数也就越多
      for (int i = 0; i < connection.weight; i++) {
        virtualSlaves.add(redisClient);
      }
      // redis 连接异常时自动从slave列表中删除
      redisClient.setClosedHandler(
          new AsyncRedisClient.ClosedHandler() {
            @Override
            public void onClosed(AsyncRedisClient client) {
              slaves.remove(redisClient);
              while (virtualSlaves.remove(redisClient)) {}
            }
          });
      // redis 重连成功时重新加入slave列表
      redisClient.setConnectedHandler(
          new AsyncRedisClient.ConnectedHandler() {
            @Override
            public void onConnected(AsyncRedisClient client) {
              slaves.add(redisClient);
              for (int i = 0; i < connection.weight; i++) {
                virtualSlaves.add(redisClient);
              }
            }
          });
    }

    hashKey = builder.toString();
  }