Skip to content

Commit 12cf6f7

Browse files
committed
TODO 反序列化失败
1 parent a6b50df commit 12cf6f7

File tree

8 files changed

+84
-11
lines changed

8 files changed

+84
-11
lines changed

TODO.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
- 反序列化时 RedisObject因为是抽象类会导致失败
12
- 带有删除性质的命令 要对已经为空的key进行删除,这部分可以抽象到父类中
23
- 重构下命令的参数校验,重复度有点高,可以通过注解的方式标注每一个命令的参数和校验规则,然后走统一的校验逻辑
34
- 是否也能做一个分布式的集群,节点之间需要通信?(利用ZK?)

src/main/java/ginyu/common/Consoles.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private static String format(String from, Object... arguments) {
158158
String computed = from;
159159
if (arguments != null && arguments.length != 0) {
160160
for (Object argument : arguments) {
161-
computed = computed.replaceFirst("\\{\\}", Matcher.quoteReplacement(argument.toString()));
161+
computed = computed.replaceFirst("\\{\\}", Matcher.quoteReplacement(String.valueOf(argument)));
162162
}
163163
}
164164
return computed;

src/main/java/ginyu/core/Server.java

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import ginyu.persist.ServerForSaver;
1010
import ginyu.persist.SnapshotSaver;
1111
import ginyu.task.CleanExpiredTask;
12+
import ginyu.task.SimpleSnapshotSaverTask;
1213
import ginyu.task.WakeupTimeoutClientTask;
1314
import ginyu.utils.ConfigUtils;
1415
import lombok.Getter;
@@ -47,6 +48,8 @@ public class Server {
4748

4849
private WakeupTimeoutClientTask wakeupTimeoutClientTask;
4950

51+
private SimpleSnapshotSaverTask simpleSnapshotSaverTask;
52+
5053
private Server() {
5154
}
5255

@@ -57,6 +60,7 @@ public void init(String[] args) {
5760
this.db = new Db(this.ginyuConfig.getDbSize());
5861
this.cleanExpiredTask = new CleanExpiredTask();
5962
this.wakeupTimeoutClientTask = new WakeupTimeoutClientTask();
63+
this.simpleSnapshotSaverTask = new SimpleSnapshotSaverTask();
6064
this.saver = new SnapshotSaver();
6165
}
6266

@@ -104,6 +108,7 @@ public void removeClient(Client client) {
104108
private void startTask() {
105109
this.cleanExpiredTask.start();
106110
this.wakeupTimeoutClientTask.start();
111+
// this.simpleSnapshotSaverTask.start();
107112
}
108113

109114
public void save() {

src/main/java/ginyu/db/Database.java

+15-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import ginyu.object.Dict;
66
import ginyu.object.RedisObject;
77
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
810

911
import java.util.Set;
1012
import java.util.concurrent.ConcurrentSkipListMap;
@@ -19,18 +21,26 @@
1921
public class Database {
2022

2123
@Getter
22-
private final Integer id;
24+
@Setter
25+
private Integer id;
2326

2427
@Getter
25-
private final Dict<String, RedisObject> dict;
28+
@Setter
29+
private Dict<String, RedisObject> dict;
2630

2731
@Getter
28-
private final ConcurrentSkipListMap<String, Long> expired;
32+
@Setter
33+
private ConcurrentSkipListMap<String, Long> expired;
2934

30-
private final Dict<String, ConcurrentSkipListSet<BlockEvent>> blockingDict;
35+
private Dict<String, ConcurrentSkipListSet<BlockEvent>> blockingDict;
3136

3237
@Getter
33-
private final ConcurrentSkipListSet<ClientTimeoutWrapper> timeoutSets;
38+
@Setter
39+
private ConcurrentSkipListSet<ClientTimeoutWrapper> timeoutSets;
40+
41+
public Database() {
42+
this.blockingDict = new Dict<>();
43+
}
3444

3545
public Database(Integer id) {
3646
this.id = id;

src/main/java/ginyu/db/Db.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ginyu.db;
22

33
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
45

56
import java.util.ArrayList;
67
import java.util.List;
@@ -13,7 +14,10 @@
1314
public class Db {
1415

1516
@Getter
16-
private final List<Database> databases;
17+
private List<Database> databases;
18+
19+
public Db() {
20+
}
1721

1822
public Db(Integer dbSize) {
1923
this.databases = new ArrayList<>(dbSize);

src/main/java/ginyu/object/RedisObject.java

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* @date: 2020/10/13 10:05 下午
88
* @description:
99
*/
10+
1011
@Data
1112
public abstract class RedisObject<T> {
1213

src/main/java/ginyu/persist/SnapshotSaver.java

+26-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package ginyu.persist;
22

33
import com.alibaba.fastjson.JSONObject;
4+
import com.alibaba.fastjson.parser.ParserConfig;
5+
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
6+
import com.alibaba.fastjson.util.FieldInfo;
47
import ginyu.common.Consoles;
58
import ginyu.core.Server;
69
import ginyu.db.Db;
710
import ginyu.event.Events;
11+
import ginyu.object.RedisObject;
12+
import ginyu.object.StringObject;
813
import org.apache.commons.io.FileUtils;
914

1015
import java.io.File;
1116
import java.io.IOException;
17+
import java.lang.reflect.Type;
1218
import java.nio.charset.Charset;
1319
import java.util.function.Supplier;
1420

@@ -21,8 +27,24 @@
2127
*/
2228
public class SnapshotSaver implements Saver {
2329

30+
private final ParserConfig parserConfig = new ParserConfig() {
31+
@Override
32+
public ObjectDeserializer getDeserializer(FieldInfo fieldInfo) {
33+
Consoles.info("{}", fieldInfo);
34+
return super.getDeserializer(fieldInfo);
35+
}
36+
37+
@Override
38+
public ObjectDeserializer getDeserializer(Type type) {
39+
if (type == RedisObject.class) {
40+
return super.getDeserializer(StringObject.class);
41+
}
42+
return super.getDeserializer(type);
43+
}
44+
};
45+
2446
@Override
25-
public void save() {
47+
public synchronized void save() {
2648
Events.post((Supplier<Void>) () -> {
2749
final Server server = Server.INSTANCE;
2850
ServerForSaver serverForSaver = new ServerForSaver();
@@ -42,17 +64,17 @@ public void save() {
4264
}
4365

4466
@Override
45-
public void load(String filePath) throws IOException {
67+
public synchronized void load(String filePath) throws IOException {
4668
if (filePath == null) {
4769
filePath = DEFAULT_SNAPSHOT_PATH;
4870
}
4971
File file = new File(filePath);
5072
if (!file.exists() || !file.canRead()) {
51-
Consoles.debug("The snapshot %s can't be read", file);
73+
Consoles.debug("The snapshot {} can't be read", file);
5274
return;
5375
}
5476
String snapshotJson = FileUtils.readFileToString(file, Charset.defaultCharset());
55-
ServerForSaver serverForSaver = JSONObject.parseObject(snapshotJson, ServerForSaver.class);
77+
ServerForSaver serverForSaver = JSONObject.parseObject(snapshotJson, ServerForSaver.class, parserConfig);
5678
Server.INSTANCE.loadFromSaver(serverForSaver);
5779
}
5880
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ginyu.task;
2+
3+
import ginyu.common.Consoles;
4+
import ginyu.core.Server;
5+
import ginyu.db.Database;
6+
import ginyu.db.Db;
7+
8+
import java.util.*;
9+
import java.util.concurrent.ConcurrentSkipListMap;
10+
11+
/**
12+
* @author: junjiexun
13+
* @date: 2020/10/14 10:09 下午
14+
* @description:
15+
*/
16+
public class SimpleSnapshotSaverTask {
17+
18+
private final Timer timer = new Timer("ginyu-snapshto-save", true);
19+
20+
public void start() {
21+
this.timer.schedule(new TimerTask() {
22+
@Override
23+
public void run() {
24+
Consoles.info("Try to save snapshot...");
25+
Server.INSTANCE.save();
26+
}
27+
}, 3000, 1000 * 20);
28+
}
29+
30+
}

0 commit comments

Comments
 (0)