聊聊claudb的set command
序
本文主要研究一下claudb的set command
SetAddCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetAddCommand.java
@Command("sadd")
@ParamLength(2)
@ParamType(DataType.SET)
public class SetAddCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
List<SafeString> values = request.getParams().stream().skip(1).collect(toList());
DatabaseValue value = db.merge(safeKey(request.getParam(0)), set(values),
(oldValue, newValue) -> set(oldValue.getSet().appendAll(newValue.getSet())));
return integer(value.size());
}
}
- SetAddCommand实现了DBCommand接口,其execute方法先从request参数提取values,然后执行db.merge,使用oldValue.getSet().appendAll(newValue.getSet())
SetMembersCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetMembersCommand.java
@ReadOnly
@Command("smembers")
@ParamLength(1)
@ParamType(DataType.SET)
public class SetMembersCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
DatabaseValue value = db.getOrDefault(safeKey(request.getParam(0)), DatabaseValue.EMPTY_SET);
return convert(value);
}
}
- SetMembersCommand实现了DBCommand接口,其execute方法通过db.getOrDefault获取DatabaseValue
SetCardinalityCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetCardinalityCommand.java
@ReadOnly
@Command("scard")
@ParamLength(1)
@ParamType(DataType.SET)
public class SetCardinalityCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableSet<SafeString> set = db.getSet(request.getParam(0));
return integer(set.size());
}
}
- SetCardinalityCommand实现了DBCommand接口,其execute方法通过db.getSet(request.getParam(0))获取ImmutableSet,然后返回set.size()
SetIsMemberCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetIsMemberCommand.java
@ReadOnly
@Command("sismember")
@ParamLength(2)
@ParamType(DataType.SET)
public class SetIsMemberCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableSet<SafeString> set = db.getSet(request.getParam(0));
return integer(set.contains(request.getParam(1)));
}
}
- SetIsMemberCommand实现了DBCommand接口,其execute方法通过db.getSet(request.getParam(0))获取ImmutableSet,然后再通过set.contains(request.getParam(1))判断是否存在指定元素
SetRemoveCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetRemoveCommand.java
@Command("srem")
@ParamLength(2)
@ParamType(DataType.SET)
public class SetRemoveCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableList<SafeString> items = request.getParams().asList().tail();
List<SafeString> removed = new LinkedList<>();
db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_SET,
(oldValue, newValue) -> {
ImmutableSet<SafeString> oldSet = oldValue.getSet();
oldSet.intersection(items.asSet()).stream().forEach(removed::add);
return set(oldSet.removeAll(items));
});
return integer(removed.size());
}
}
- SetRemoveCommand实现了DBCommand接口,其execute方法先从request参数提取items,然后执行db.merge,使用oldSet.intersection取出交集,然后执行oldSet.removeAll(items)
SetUnionCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetUnionCommand.java
@ReadOnly
@Command("sunion")
@ParamLength(2)
@ParamType(DataType.SET)
public class SetUnionCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableSet<SafeString> result = db.getSet(request.getParam(0));
for (SafeString param : request.getParams().asList().tail()) {
result = result.union(db.getSet(param));
}
return convert(result);
}
}
- SetUnionCommand实现了DBCommand接口,其execute方法先获取ImmutableSet,然后遍历参数值挨个执行result.union(db.getSet(param))
SetIntersectionCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetIntersectionCommand.java
@ReadOnly
@Command("sinter")
@ParamLength(2)
@ParamType(DataType.SET)
public class SetIntersectionCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableSet<SafeString> result = db.getSet(request.getParam(0));
for (SafeString param : request.getParams().asList().tail()) {
result = result.intersection(db.getSet(param));
}
return convert(result);
}
}
- SetIntersectionCommand实现了DBCommand接口,其execute方法先获取ImmutableSet,然后遍历参数值挨个执行result.intersection(db.getSet(param))
SetDifferenceCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetDifferenceCommand.java
@ReadOnly
@Command("sdiff")
@ParamLength(2)
@ParamType(DataType.SET)
public class SetDifferenceCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
ImmutableSet<SafeString> result = db.getSet(request.getParam(0));
for (SafeString param : request.getParams().asList().tail()) {
result = result.difference(db.getSet(param));
}
return convert(result);
}
}
- SetDifferenceCommand实现了DBCommand接口,其execute方法先获取ImmutableSet,然后遍历参数值挨个执行result.difference(db.getSet(param))
小结
claudb set相关的command有SetAddCommand、SetMembersCommand、SetCardinalityCommand、SetIsMemberCommand、SetRemoveCommand、SetUnionCommand、SetIntersectionCommand、SetDifferenceCommand
doc
- [command/set(claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/set)
- day9、用户登陆出现-bash-4.1$错误的原因及解决方法
- jboss eap 6.3 域(Domain)模式配置
- 揭穿数据分析的12个神话
- jboss eap 6.3 集群(cluster)配置
- Django中Q查询及Q()对象
- jboss eap 6.3 集群(cluster)-Session 复制(Replication)
- JSP中的Servlet及Filter
- Django ORM详解
- Web前端培训:怎样成长为一个优秀的Web 前端开发工程师?
- Git操作
- 人工智能做的肉,你想吃吗?
- 二、爬虫基础库
- 鱼与熊掌兼得,既要云服务创新也要管理传统网络
- Django-model进阶(中介模型,查询优化,extra,整体插入)
- 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 数组属性和方法
- python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
- Js 的事件循环(Event Loop)机制以及实例讲解
- 你不知道的js中关于this绑定机制的解析[看完还不懂算我输]
- 解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
- 算法-查找斐波纳契数列中第 N 个数
- 在python中修改.properties文件的操作
- Django Xadmin多对多字段过滤实例
- 算法-姓名去重
- Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
- Python Opencv中用compareHist函数进行直方图比较对比图片
- 面试题-树状数组结构转化
- Xadmin+rules实现多选行权限方式(级联效果)
- Android仿主流壁纸App设置界面
- Android中WindowManager与WMS的解析
- 算法(简单)_搜索二维矩阵&分解质因数