聊聊claudb的list command
序
本文主要研究一下claudb的list command
LeftPushCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPushCommand.java
@Command("lpush")
@ParamLength(2)
@ParamType(DataType.LIST)
public class LeftPushCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableList<SafeString> values = request.getParams().asList().tail().reverse();
DatabaseValue result = db.merge(safeKey(request.getParam(0)), list(values),
(oldValue, newValue) -> list(newValue.getList().appendAll(oldValue.getList())));
return RedisToken.integer(result.size());
}
}
- LeftPushCommand实现了DBCommand接口,其execute方法提取values,然后执行db.merge,在newValue.getList()之后追加上oldValue.getList()
LeftPopCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPopCommand.java
@Command("lpop")
@ParamLength(1)
@ParamType(DataType.LIST)
public class LeftPopCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
List<SafeString> removed = new LinkedList<>();
db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST,
(oldValue, newValue) -> {
ImmutableList<SafeString> list = oldValue.getList();
list.head().stream().forEach(removed::add);
return list(list.tail());
});
if (removed.isEmpty()) {
return nullString();
} else {
return string(removed.remove(0));
}
}
}
- LeftPopCommand实现了DBCommand接口,其execute方法执行db.merge,它先获取oldValue.getList(),然后取出head添加到removed中,然后再通过list.tail()丢弃head作为新的结果
RightPushCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/RightPushCommand.java
@Command("rpush")
@ParamLength(2)
@ParamType(DataType.LIST)
public class RightPushCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableList<SafeString> values = request.getParams().asList().tail();
DatabaseValue result = db.merge(safeKey(request.getParam(0)), list(values),
(oldValue, newValue) -> list(oldValue.getList().appendAll(newValue.getList())));
return integer(result.size());
}
}
- RightPushCommand实现了DBCommand接口,其execute方法提取values,然后执行db.merge,在oldValue.getList()之后追加上newValue.getList()
RightPopCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/RightPopCommand.java
@Command("rpop")
@ParamLength(1)
@ParamType(DataType.LIST)
public class RightPopCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
List<SafeString> removed = new LinkedList<>();
db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST,
(oldValue, newValue) -> {
ImmutableList<SafeString> list = oldValue.getList();
list.reverse().head().stream().forEach(removed::add);
return list(list.reverse().tail().reverse());
});
if (removed.isEmpty()) {
return nullString();
} else {
return string(removed.remove(0));
}
}
}
- RightPopCommand实现了DBCommand接口,其execute方法执行db.merge,它先获取oldValue.getList(),然后取出list倒数的head添加到removed中,然后再通过list.reverse().tail()丢弃head再reverse作为新的结果
ListLengthCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListLengthCommand.java
@ReadOnly
@Command("llen")
@ParamLength(1)
@ParamType(DataType.LIST)
public class ListLengthCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableList<SafeString> list = db.getList(request.getParam(0));
return integer(list.size());
}
}
- ListLengthCommand实现了DBCommand接口,其execute方法先通过db.getList(request.getParam(0))获取list,然后返回integer(list.size())
ListRangeCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListRangeCommand.java
@ReadOnly
@Command("lrange")
@ParamLength(3)
@ParamType(DataType.LIST)
public class ListRangeCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
try {
DatabaseValue value = db.getOrDefault(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST);
ImmutableList<SafeString> list = value.getList();
int from = Integer.parseInt(request.getParam(1).toString());
if (from < 0) {
from = list.size() + from;
}
int to = Integer.parseInt(request.getParam(2).toString());
if (to < 0) {
to = list.size() + to;
}
int min = Math.min(from, to);
int max = Math.max(from, to);
// TODO: use Array
ImmutableList<SafeString> result = ImmutableList.from(list.stream().skip(min).limit((max - min) + 1));
return convert(result);
} catch (NumberFormatException e) {
return error("ERR value is not an integer or out of range");
}
}
}
- ListRangeCommand实现了DBCommand接口,其execute方法先获取list,之后修正min及max,然后取ImmutableList.from(list.stream().skip(min).limit((max - min) + 1))
ListIndexCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListIndexCommand.java
@ReadOnly
@Command("lindex")
@ParamLength(2)
@ParamType(DataType.LIST)
public class ListIndexCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
try {
ImmutableList<SafeString> list = db.getList(request.getParam(0));
int index = Integer.parseInt(request.getParam(1).toString());
if (index < 0) {
index = list.size() + index;
}
// TODO: fix asArray
return string(list.asArray().get(index));
} catch (NumberFormatException e) {
return error("ERR value is not an integer or out of range");
} catch (IndexOutOfBoundsException e) {
return nullString();
}
}
}
- ListIndexCommand实现了DBCommand接口,其execute方法先获取list,然后返回string(list.asArray().get(index))
ListSetCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListSetCommand.java
@Command("lset")
@ParamLength(3)
@ParamType(DataType.LIST)
public class ListSetCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
try {
int index = Integer.parseInt(request.getParam(1).toString());
db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST,
(oldValue, newValue) -> {
ImmutableList<SafeString> oldList = oldValue.getList();
// TODO: use Array
List<SafeString> array = new ArrayList<>(oldList.toList());
array.set(index > -1 ? index : array.size() + index, request.getParam(2));
return list(array);
});
return status("OK");
} catch (NumberFormatException e) {
return error("ERR value is not an integer or out of range");
} catch (IndexOutOfBoundsException e) {
return error("ERR index out of range");
}
}
}
- ListSetCommand实现了DBCommand接口,其execute方法先读取index参数,然后执行db.merge,它读取oldList,然后执行array.set(index > -1 ? index : array.size() + index, request.getParam(2)),最后返回list(array)
小结
claudb list相关的command有LeftPushCommand、LeftPopCommand、RightPushCommand、RightPopCommand、ListLengthCommand、ListRangeCommand、ListIndexCommand、ListSetCommand
doc
- cubieboard(树莓派)安装Ubuntu+Apache+PHP+Mysql
- Oracle 12c里的几点补充(一)(r11笔记第7天)
- Oracle备库的PDB无法连接的问题(r11笔记第6天)
- Golang语言社区--模板的使用
- Golang语言写Web 应用程序
- 强制wordpress后台HTTPS
- Golang语言 Cookie的使用
- Golang 语言调用动态库实现OpenGL及windows的API编程
- MySQL中的Online DDL(第一篇)(r11笔记第3天)
- 转--quick-cocos做客户端,golang做服务端,实现HTTP通信
- Nginx配置SSL证书
- Golang语言RPC Authorization进行简单ip安全验证的方法
- 深入理解Oracle中的DBCA
- Golang语言goto语句
- 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 数组属性和方法
- JavaWeb——Maven基础之详细总结,从零开始搭建Maven工程,包含一些常见的坑org.eclipse.jdt.internal.compiler.classfmt.ClassFormatEx
- JavaWeb——Redis数据库之Jedis操作5种类型数据的使用总结与前端Ajax获取Redis缓存数据的案例实战(结合了MySQL数据库)
- Java——数据库编程JDBC之快速入门吐血总结及各关键对象详解(提供了JDBCUtils工具类)
- MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结
- MySQL数据库——数据库的设计(多表之间的关系与三大范式)与备份还原
- JavaWeb——JSP入门学习(JSP基本概念、JSP脚本、JSP内置对象)
- MySQL数据库——数据库CRUD之基本DML增删改表操作及DQL查表操作
- JavaWeb——AJAX异步技术实现方式与案例实战(原生的JS方式、使用JQuery方式)
- JavaWeb——一文带你入门Servlet(生命周期、注解配置方法、IDEA与tomcat的相关配置)
- JavaWeb——JQuery之基础案例实战(实现表格隔行换色、实现全选全不选、QQ表情选择、下拉列表选中条目左右选择功能)
- JavaWeb——JQuery之DOM操作应用及实践案例总结(DOM内容操作、DOM属性操作、CRUD操作)
- JavaWeb——Filter过滤器快速入门与是否登录验证&过滤敏感词汇案例实战(Filter配置方式、执行流程、生命周期方法、过滤器链)
- JavaWeb——会话技术之Session快速入门与验证码登录案例实战(Session实现原理、使用细节、快速入门、Session的特点)
- Nginx配置文件服务器
- JavaWeb——会话技术之Cookie快速入门与案例实战(详细讲解了Cookie实现原理、Cookie使用细节、Cookie的特点及作用)