前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊claudb的server command

聊聊claudb的server command

作者头像
code4it
发布2020-08-28 09:37:17
1970
发布2020-08-28 09:37:17
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下claudb的server command

SelectCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SelectCommand.java

代码语言:javascript
复制
@ReadOnly
@Command("select")
@ParamLength(1)
public class SelectCommand implements DBCommand {

  @Override
  public RedisToken execute(Database db, Request request) {
    try {
      getSessionState(request.getSession()).setCurrentDB(parseCurrentDB(request));
      return responseOk();
    } catch (NumberFormatException e) {
      return error("ERR invalid DB index");
    }
  }

  private int parseCurrentDB(Request request) {
    return parseInt(request.getParam(0).toString());
  }
}
  • SelectCommand实现了DBCommand接口,其execute方法执行getSessionState(request.getSession()).setCurrentDB(parseCurrentDB(request))

SyncCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SyncCommand.java

代码语言:javascript
复制
@ReadOnly
@Command("sync")
public class SyncCommand implements DBCommand {

  private MasterReplication master;

  @Override
  public RedisToken execute(Database db, Request request) {
    try {
      DBServerContext server = getClauDB(request.getServerContext());

      ByteBufferOutputStream output = new ByteBufferOutputStream();
      server.exportRDB(output);

      if (master == null) {
        master = new MasterReplication(server);
        master.start();
      }

      master.addSlave(request.getSession().getId());

      return string(new SafeString(output.toByteArray()));
    } catch (IOException e) {
      return error("ERROR replication error");
    }
  }
}
  • SyncCommand实现了DBCommand接口,其execute方法先通过getClauDB获取server,然后执行server.exportRDB(output)、master.addSlave(request.getSession().getId()),然后返回string(new SafeString(output.toByteArray()))

SlaveOfCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SlaveOfCommand.java

代码语言:javascript
复制
@ReadOnly
@Command("slaveof")
@ParamLength(2)
public class SlaveOfCommand implements DBCommand {

  private SlaveReplication slave;

  @Override
  public RedisToken execute(Database db, Request request) {
    String host = request.getParam(0).toString();
    String port = request.getParam(1).toString();

    boolean stopCurrent = "NO".equals(host) && "ONE".equals(port);

    if (slave == null) {
      if (!stopCurrent) {
        startReplication(request, host, port);
      }
    } else {
      slave.stop();

      if (!stopCurrent) {
        startReplication(request, host, port);
      }
    }

    return responseOk();
  }

  private void startReplication(Request request, String host, String port) {
    slave = new SlaveReplication(
        getClauDB(request.getServerContext()), request.getSession(), host, Integer.parseInt(port));

    slave.start();
  }
}
  • SlaveOfCommand实现了DBCommand接口,其execute方法在非stopCurrent的条件下执行startReplication;startReplication方法创建SlaveReplication,然后执行slave.start()

RoleCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/RoleCommand.java

代码语言:javascript
复制
@ReadOnly
@Command("role")
public class RoleCommand implements DBCommand {

  @Override
  public RedisToken execute(Database db, Request request) {
    DBServerState serverState = getServerState(request.getServerContext());
    Database adminDatabase = getAdminDatabase(request.getServerContext());
    return serverState.isMaster() ? master(adminDatabase) : slave(adminDatabase);
  }

  private RedisToken slave(Database adminDatabase) {
    ImmutableMap<SafeString, SafeString> hash = adminDatabase.getHash(safeString("master"));
    return array(string("slave"),
                 string(hash.get(safeString("host")).get()),
                 integer(hash.get(safeString("port")).map(port -> parseInt(port.toString())).get()),
                 string(hash.get(safeString("state")).get()), integer(0));
  }

  private RedisToken master(Database adminDatabase) {
    return array(string("master"), integer(0), array(slaves(adminDatabase)));
  }

  private ImmutableList<RedisToken> slaves(Database adminDatabase) {
    DatabaseValue value = adminDatabase.getOrDefault(safeKey("slaves"), DatabaseValue.EMPTY_SET);
    ImmutableList<SafeString> set = value.getSet().asList().sort(SafeString::compareTo);
    return set.map(SafeString::toString)
        .map(slave -> slave.split(":"))
        .map(slave -> array(string(slave[0]), string(slave[1]), string("0"))).asList();
  }
}
  • RoleCommand实现了DBCommand接口,其execute方法先获取serverState及adminDatabase,然后根据serverState.isMaster()返回master(adminDatabase)或slave(adminDatabase)

FlushDBCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/FlushDBCommand.java

代码语言:javascript
复制
@Command("flushdb")
public class FlushDBCommand implements DBCommand {

  @Override
  public RedisToken execute(Database db, Request request) {
    db.clear();
    return responseOk();
  }
}
  • FlushDBCommand实现了DBCommand接口,其execute方法执行db.clear()

DatabaseSizeCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/DatabaseSizeCommand.java

代码语言:javascript
复制
@Command("dbsize")
public class DatabaseSizeCommand implements DBCommand {
  @Override
  public RedisToken execute(Database db, Request request) {
    return integer(db.size());
  }
}
  • DatabaseSizeCommand实现了DBCommand接口,其execute方法返回integer(db.size())

小结

claudb server相关的command有SelectCommand、SyncCommand、SlaveOfCommand、RoleCommand、FlushDBCommand、DatabaseSizeCommand

doc

  • SelectCommand
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SelectCommand
  • SyncCommand
  • SlaveOfCommand
  • RoleCommand
  • FlushDBCommand
  • DatabaseSizeCommand
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档