序
本文次要钻研一下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)