Skip to content

Commit e91a58e

Browse files
committed
sadd ok
1 parent b9b06c8 commit e91a58e

14 files changed

+316
-2
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@ Redis implment with PURE Java
44

55

66
## TODO
7+
- zadd
8+
- zrange
9+
- zcard
10+
- zscore
11+
- zrem
12+
- zincrby

banner.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
| j # |
33
| W j |
44
| # : : # |
5-
|# ; ; ; ; ; ; # |
5+
| # ; ; ; ; ; ; # |
66
| # # ; ; ; ; ; ; ; ; # # |
77
| # # ; ; ; ; ; ; , , ; ; ; ; # # |
88
| ; ; ; ; ; ; ; ; ; ; ; ; ; ; |

src/main/java/cmd/connection/Ping.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.netty.channel.ChannelHandlerContext;
66
import protocol.*;
77

8+
import static common.Constants.SLOGAN;
9+
810
/**
911
* @author: junjiexun
1012
* @date: 2020/10/13 1:56 下午
@@ -30,7 +32,7 @@ protected void validate(String commandName, Arrays arrays) {
3032
@Override
3133
protected Resp2 doCommand0(PingArg arg, ChannelHandlerContext ctx) {
3234
if (arg.getMessage() == null) {
33-
return SimpleStrings.create("ギニュー特戦队! Ginyu!");
35+
return SimpleStrings.create(SLOGAN + "Ginyu!");
3436
} else {
3537
return BulkStrings.create(arg.getMessage());
3638
}

src/main/java/cmd/set/SAdd.java

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package cmd.set;
2+
3+
import cmd.AbstractRedisCommand;
4+
import cmd.Command;
5+
import common.Attributes;
6+
import common.Constants;
7+
import core.Client;
8+
import core.Server;
9+
import db.Database;
10+
import io.netty.channel.ChannelHandlerContext;
11+
import object.HashObject;
12+
import object.ObjectType;
13+
import object.SetObject;
14+
import protocol.Arrays;
15+
import protocol.Integers;
16+
import protocol.Resp2;
17+
import protocol.Validates;
18+
19+
import java.util.List;
20+
21+
import static object.None.NONE;
22+
23+
/**
24+
* @author: junjiexun
25+
* @date: 2020/10/16 10:41 上午
26+
* @description:
27+
*/
28+
@SuppressWarnings("all")
29+
@Command(name = "sadd")
30+
public class SAdd extends AbstractRedisCommand<SAddArg> {
31+
@Override
32+
protected SAddArg createArg(Arrays arrays) {
33+
List<String> argList = arrays.map2String(true);
34+
return new SAddArg(
35+
argList.remove(0),
36+
argList.toArray(Constants.STR_EMPTY_ARRAY)
37+
);
38+
}
39+
40+
@Override
41+
protected void validate(String commandName, Arrays arrays) {
42+
Validates.validateArraysSize(commandName, arrays, 3, null);
43+
}
44+
45+
@Override
46+
protected Resp2 doCommand0(SAddArg arg, ChannelHandlerContext ctx) {
47+
Client client = Attributes.getClient(ctx);
48+
Database database = Server.INSTANCE.getDb().getDatabase(client.getDb());
49+
SetObject setObject = Validates.validateType(database.get(arg.getKey()), ObjectType.SET);
50+
if (setObject == null) {
51+
return Integers.ZERO;
52+
}
53+
int added = 0;
54+
for (String member : arg.getMembers()) {
55+
if (!setObject.getOriginal().containsKey(member)) {
56+
added++;
57+
}
58+
setObject.getOriginal().put(member, NONE);
59+
}
60+
return Integers.create(added);
61+
}
62+
}

src/main/java/cmd/set/SAddArg.java

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cmd.set;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
/**
7+
* @author: junjiexun
8+
* @date: 2020/10/16 10:41 上午
9+
* @description:
10+
*/
11+
@Data
12+
@AllArgsConstructor
13+
public class SAddArg {
14+
15+
private String key;
16+
17+
private String[] members;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cmd.sortedset;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
/**
7+
* @author: junjiexun
8+
* @date: 2020/10/15 10:14 下午
9+
* @description:
10+
*/
11+
@Data
12+
@AllArgsConstructor
13+
public class ScoreMember {
14+
15+
private String score;
16+
17+
private String member;
18+
}

src/main/java/cmd/sortedset/ZAdd.java

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cmd.sortedset;
2+
3+
import cmd.AbstractRedisCommand;
4+
import cmd.Command;
5+
import io.netty.channel.ChannelHandlerContext;
6+
import protocol.Arrays;
7+
import protocol.Resp2;
8+
import protocol.Validates;
9+
10+
/**
11+
* @author: junjiexun
12+
* @date: 2020/10/16 2:54 下午
13+
* @description:
14+
*/
15+
@SuppressWarnings("all")
16+
@Command(name = "zadd")
17+
public class ZAdd extends AbstractRedisCommand<ZAddArg> {
18+
19+
@Override
20+
protected ZAddArg createArg(Arrays arrays) {
21+
return null;
22+
}
23+
24+
@Override
25+
protected void validate(String commandName, Arrays arrays) {
26+
Validates.validateArraysSize(commandName, arrays, 4, null);
27+
}
28+
29+
@Override
30+
protected Resp2 doCommand0(ZAddArg arg, ChannelHandlerContext ctx) {
31+
return null;
32+
}
33+
}
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cmd.sortedset;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
/**
7+
* @author: junjiexun
8+
* @date: 2020/10/16 2:54 下午
9+
* @description:
10+
*/
11+
@Data
12+
@AllArgsConstructor
13+
public class ZAddArg {
14+
15+
private String key;
16+
17+
private Boolean xx;
18+
19+
private Boolean nx;
20+
21+
private Boolean incr;
22+
23+
private Boolean ch;
24+
25+
private ScoreMember[] scoreMembers;
26+
27+
}

src/main/java/common/Constants.java

+2
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,6 @@ public abstract class Constants {
3030

3131
public static final String[] STR_EMPTY_ARRAY = new String[]{};
3232
public static final HashEntry[] HASH_ENTRIES_EMPTY_ARRAY = new HashEntry[]{};
33+
34+
public static String SLOGAN = "ギニュー特戦队!";
3335
}

src/main/java/object/None.java

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package object;
2+
3+
public class None {
4+
5+
public static final None NONE = new None();
6+
7+
private None() {}
8+
}

src/main/java/object/SetObject.java

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package object;
2+
3+
/**
4+
* @author: junjiexun
5+
* @date: 2020/10/13 10:48 下午
6+
* @description:
7+
*/
8+
public class SetObject extends RedisObject<Dict<String, None>> {
9+
10+
public SetObject() {
11+
this.setType(ObjectType.SET);
12+
this.setOriginal(new Dict<>());
13+
}
14+
}

src/main/java/object/ZSet.java

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package object;
2+
3+
import cmd.sortedset.ScoreMember;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.Setter;
7+
8+
import java.util.concurrent.ConcurrentHashMap;
9+
10+
import static common.Constants.SLOGAN;
11+
12+
/**
13+
* @author: junjiexun
14+
* @date: 2020/10/16 3:18 下午
15+
* @description:
16+
*/
17+
@SuppressWarnings("all")
18+
public class ZSet {
19+
20+
@AllArgsConstructor
21+
static class ZSetNode implements Comparable<ZSetNode> {
22+
23+
Double score;
24+
25+
String member;
26+
27+
@Getter
28+
@Setter
29+
ZSetNode prev;
30+
31+
@Setter
32+
@Getter
33+
ZSetNode next;
34+
35+
@Override
36+
public int hashCode() {
37+
return score.hashCode() + member.hashCode();
38+
}
39+
40+
@Override
41+
public boolean equals(Object obj) {
42+
if (obj == null || !(obj instanceof ZSetNode)) {
43+
return false;
44+
}
45+
ZSetNode other = (ZSetNode) obj;
46+
return this.score.equals(other.score) && this.member.equals(other.member);
47+
}
48+
49+
@Override
50+
public int compareTo(ZSetNode o) {
51+
if (this.score.equals(o.score)) {
52+
return this.member.compareTo(o.member);
53+
}
54+
return this.score.compareTo(o.score);
55+
}
56+
}
57+
58+
private ConcurrentHashMap<String, Double> members = new ConcurrentHashMap<>();
59+
60+
private final ZSetNode HEAD = new ZSetNode(Double.MIN_VALUE, SLOGAN, null, null);
61+
private volatile ZSetNode TAIL;
62+
63+
public boolean exists(String member) {
64+
return this.members.containsKey(member);
65+
}
66+
67+
public void addNodes(ScoreMember[] scoreMembers, Boolean xx, Boolean nx, Boolean incr, Boolean ch) {
68+
ZSetNode node = this.HEAD.next;
69+
while (node != null) {
70+
71+
}
72+
}
73+
}

src/main/java/object/ZSetObject.java

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package object;
2+
3+
/**
4+
* @author: junjiexun
5+
* @date: 2020/10/13 10:48 下午
6+
* @description:
7+
*/
8+
public class ZSetObject extends RedisObject<ZSet> {
9+
10+
public ZSetObject() {
11+
this.setType(ObjectType.ZSET);
12+
}
13+
}

src/test/java/JUnitDemo.java

+38
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import common.Consoles;
2+
import lombok.AllArgsConstructor;
3+
import lombok.Data;
24
import org.apache.commons.io.FileUtils;
35
import org.junit.Test;
46

57
import java.io.File;
68
import java.io.IOException;
79
import java.nio.charset.Charset;
10+
import java.util.concurrent.ConcurrentSkipListSet;
811

912
/**
1013
* @author: junjiexun
@@ -28,6 +31,41 @@ public void test() throws IOException {
2831
Consoles.lightGray("akdsjflkajd");
2932
Consoles.white("dkfj");
3033
Consoles.magenta("dajkfjkdkfj");
34+
}
35+
36+
@Test
37+
public void test1() {
38+
ConcurrentSkipListSet<Double> set = new ConcurrentSkipListSet<>();
39+
set.add(7.7D);
40+
set.add(1.7D);
41+
set.add(2.7D);
42+
set.add(4.7D);
43+
set.add(-3.7D);
44+
set.add(7.8D);
45+
set.add(-123.7D);
46+
System.out.println(set);
47+
}
3148

49+
@Data
50+
@AllArgsConstructor
51+
private static class A implements Comparable<A> {
52+
private String name;
53+
54+
@Override
55+
public int compareTo(A o) {
56+
return this.name.compareTo(o.name);
57+
}
58+
}
59+
60+
@Test
61+
public void test2() {
62+
ConcurrentSkipListSet<A> set = new ConcurrentSkipListSet<>();
63+
set.add(new A("adkfj"));
64+
set.add(new A("123"));
65+
set.add(new A("addj"));
66+
set.add(new A("adfkaj"));
67+
set.add(new A("fdkfj123"));
68+
set.add(new A("dsfk34"));
69+
System.out.println(set);
3270
}
3371
}

0 commit comments

Comments
 (0)