聊聊claudb的scripting command
时间:2022-07-24
本文章向大家介绍聊聊claudb的scripting command,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下claudb的scripting command
AbstractEvalCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/scripting/AbstractEvalCommand.java
abstract class AbstractEvalCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
return script(request).map(script -> execute(request, script))
.getOrElse(error("NOSCRIPT No matching script. Please use EVAL"));
}
private RedisToken execute(Request request, SafeString script) {
int numParams = parseInt(request.getParam(1).toString());
if (numParams + 2 > request.getLength()) {
return error("invalid number of arguments");
}
List<SafeString> params = request.getParams().stream().skip(2).collect(toList());
List<SafeString> keys = readParams(numParams, params);
List<SafeString> argv = readArguments(numParams, params);
return LuaInterpreter.buildFor(request).execute(script, keys, argv);
}
protected abstract Option<SafeString> script(Request request);
private List<SafeString> readParams(int numParams, List<SafeString> params) {
List<SafeString> keys = new LinkedList<>();
for (int i = 0; i < numParams; i++) {
keys.add(params.get(i));
}
return keys;
}
private List<SafeString> readArguments(int numParams, List<SafeString> params) {
List<SafeString> argv = new LinkedList<>();
for (int i = numParams; i < params.size(); i++) {
argv.add(params.get(i));
}
return argv;
}
}
- AbstractEvalCommand实现了DBCommand接口,其execute方法先通过子类实现的script方法获取SafeString,然后再内部的execute方法执行脚本;execute方法先解析keys、argv,然后通过LuaInterpreter.buildFor(request).execute(script, keys, argv)执行lua脚本
EvalCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/scripting/EvalCommand.java
@Command("eval")
@ParamLength(2)
public class EvalCommand extends AbstractEvalCommand {
@Override
protected Option<SafeString> script(Request request) {
return Option.some(request.getParam(0));
}
}
- EvalCommand继承了AbstractEvalCommand,其script方法取request.getParam(0)
EvalShaCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/scripting/EvalShaCommand.java
@Command("evalsha")
@ParamLength(2)
public class EvalShaCommand extends AbstractEvalCommand {
@Override
protected Option<SafeString> script(Request request) {
DBServerState server = getServerState(request.getServerContext());
return server.getScript(request.getParam(0));
}
}
- EvalShaCommand继承了AbstractEvalCommand,其script方法先通过getServerState(request.getServerContext())获取server,再执行server.getScript(request.getParam(0))
ScriptCommands
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/scripting/ScriptCommands.java
@ParamLength(1)
@Command("script")
public class ScriptCommands implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
return Pattern1.<Request, RedisToken>build()
.when(isCommand("load"))
.then(this::load)
.when(isCommand("exists"))
.then(this::exists)
.when(isCommand("flush"))
.then(this::flush)
.otherwise()
.then(this::unknownCommand)
.apply(request);
}
private RedisToken unknownCommand(Request request) {
return RedisToken.error("Unknown SCRIPT subcommand: " + request.getParam(0));
}
private RedisToken load(Request request) {
SafeString script = request.getParam(1);
return Try.of(() -> digest(script)).map(sha1 -> {
DBServerState server = getServerState(request.getServerContext());
server.saveScript(safeString(sha1), script);
return RedisToken.string(sha1);
}).getOrElse(RedisToken.error("ERR cannot generate sha1 sum for script: " + script));
}
private RedisToken exists(Request request) {
DBServerState server = getServerState(request.getServerContext());
return integer(server.getScript(request.getParam(1)).isPresent());
}
private RedisToken flush(Request request) {
getServerState(request.getServerContext()).cleanScripts();
return RedisToken.responseOk();
}
private String digest(SafeString script) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
return new SafeString(digest.digest(script.getBytes())).toHexString();
}
private Matcher1<Request> isCommand(String command) {
return request -> request.getParam(0).toString().toLowerCase().equals(command);
}
}
- ScriptCommands实现了DBCommand接口,其execute方法支持load、exists、flush命令;其中load方法通过server.saveScript(safeString(sha1), script)来保存script;其exists方法通过server.getScript(request.getParam(1)).isPresent()来判断script是否存在;其flush方法执行getServerState(request.getServerContext()).cleanScripts()
小结
claudb scripting相关的command有EvalCommand、EvalShaCommand、ScriptCommands
doc
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码(一) 主体
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。
- IO约束(下)
- 可以通过基类实现的几种功能。vs2008 .net 2.0
- Python基础知识2:字典
- 桶式移位器
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.7 增加了一个js函数的分页方式。
- FireEye报告:揭露新型工控系统恶意软件TRITON
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.6 修改了几个小bug,使用演示。
- Invoke-PSImage:将PS脚本隐藏进PNG像素中并用一行指令去执行它
- linux的内存清理相关知识!
- 一个页面搞定几乎所有的列表需求的实现思路和一点代码。
- 实现 Table 的行交替颜色、选中行变色的一种方法。演示+源码
- 【知识】使用Python来学习数据科学的完整教程
- 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 数组属性和方法
- 挑苹果中的行为参数化思想
- 详解MapReduce(Spark和MapReduce对比铺垫篇)
- 使用 OWIN 作为 ASP.NET Web API 的宿主
- 二进制源码和补码的基础解释
- Spark推荐系统实践
- Xamarin Studio 比 Visual Studio 2013 好用的三个功能
- Scss (Sass) 语法简介
- 如何写一个简单的node.js c++扩展
- 给 c# 程序员的十个重要提示
- 子序列问题
- Spark实现推荐系统中的相似度算法
- iOS 中的 CFBundleShortVersionString 与 CFBundleVersion
- 买卖股票问题合集
- 服务出错优先考虑及排查手册(待续整理)
- Android 沉浸式全屏