聊聊claudb的server command
时间:2022-07-24
本文章向大家介绍聊聊claudb的server command,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下claudb的server command
SelectCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SelectCommand.java
@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
@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
@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
@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
@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
@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
- [快学Python3]List(列表)
- [快学Python3]Tuple(元组)
- HDU 1248 寒冰王座(完全背包裸题)
- [快学Python3]String(字符串)
- [快学Python3]XML解析处理 - Element Tree
- Educational Codeforces Round 21(A.暴力,B.前缀和,C.贪心)
- [快学Python3]JSON解析
- Codeforces 754A Lesha and array splitting(简单贪心)
- [快学Python3]日期和时间处理
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3)(A.B.C,3道暴力题,C可二分求解)
- [快学Python3]目录与文件操作
- Codeforces Round #411 (Div. 2)(A,B,C,D 四水题)
- [快学Python3]INI文件读写
- [快学Python3]迭代器和生成器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Cypress系列(65)- 测试运行失败自动重试
- CentOS7下编译FFMPEG源代码
- Android 的 Presentation 双屏异显,遇到的问题总结
- 音视频相关开发库和资料
- Flink深入浅出: 应用部署与原理图解(v1.11)
- 用 Github Actions 在 K8S 中运行 CI 测试
- 线程池的拒绝策略
- 15 张图带你深入理解浮点数
- 用Python实现坦克大战游戏 | 干货贴
- hexo搭建个人网站博客完全教程
- 快速入门 Python 数据库操作
- Shell脚本管道符与重定向
- 偿还技术债(3)-ARouter源码详解
- 偿还技术债(4)-ARouter自己实现一个?
- 偿还技术债(5)-LeakCanary源码详解