阿狸先森|聊聊claudb的server command
序本文主要研究一下claudb的server command
SelectCommandclaudb-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))
@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()))
@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()
@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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 三好先森|技术与人类的关系到底是什么?
- 阿狸先森|现今如何了?,被联想198亿元收购的巨头摩托罗拉
- 星晨说说|聊聊钢琴,与翻弹《杀死那个石家庄人》的阿布
- 三好先森|「精选」20个黑科技软件下载网站,让你再无找不到的软件
- 龙之队|聊聊Mysql——慢sql优化方法论
- 阿狸先森|被联想198亿元收购的巨头摩托罗拉,现今如何了?
- 小胖先森|或是华米第一款联名手表?,华米预热新品
- 苹果手机|从多摄到快充,和你聊聊苹果手机这些年“借鉴”安卓的设计
- 疯而不狗|奥匈帝国的温德尔M1867,来聊聊非常没牌面的真·转栓步枪
- 小胖先森|Hero 9 Black运动相机曝光,GoPro
