阿狸先森|聊聊claudb的server command

序本文主要研究一下claudb的server command
阿狸先森|聊聊claudb的server commandSelectCommandclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SelectCommand.java
@ReadOnly@Command("select")@ParamLength(1)public class SelectCommand implements DBCommand {?@Overridepublic 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))
SyncCommandclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SyncCommand.java
@ReadOnly@Command("sync")public class SyncCommand implements DBCommand {?private MasterReplication master;?@Overridepublic 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()))
SlaveOfCommandclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SlaveOfCommand.java
@ReadOnly@Command("slaveof")@ParamLength(2)public class SlaveOfCommand implements DBCommand {?private SlaveReplication slave;?@Overridepublic RedisToken execute(Database db, Request request) {String host = request.getParam(0).toString();String port = request.getParam(1).toString();?boolean stopCurrent = "NO".equals(host) ?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()
RoleCommandclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/RoleCommand.java
@ReadOnly@Command("role")public class RoleCommand implements DBCommand {?@Overridepublic 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 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


推荐阅读