Skip to content

Commit 101841c

Browse files
committed
细节优化
1 parent 9cb5b89 commit 101841c

File tree

9 files changed

+58
-48
lines changed

9 files changed

+58
-48
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ TXT调用和JSON调用基本一致,可以节省一些流量。或者,你甚
110110

111111
### 更新历史
112112

113+
* 2018.08.08 1.2:
114+
1. 细节优化
115+
113116
* 2018.08.06 1.1:
114117
1. 引入前缀树,使分类检索效率由 O(n) (n为所有分类数) 变为 O(L) (L为分类级数)。
115118
缺点是空间复杂度由 O(n) 变为 O(nL),代码复杂度增加60行

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>ma.luan</groupId>
88
<artifactId>yiyan</artifactId>
9-
<version>1.1</version>
9+
<version>1.2</version>
1010

1111
<properties>
1212
<java.version>1.8</java.version>

src/main/java/ma/luan/yiyan/api/ApiVerticle.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
import io.vertx.ext.web.handler.BodyHandler;
1313
import ma.luan.yiyan.constants.Key;
1414
import ma.luan.yiyan.util.ConvertUtil;
15+
import ma.luan.yiyan.util.JsonCollector;
1516
import org.apache.logging.log4j.LogManager;
1617
import org.apache.logging.log4j.Logger;
1718

1819
import java.util.Arrays;
19-
import java.util.stream.Collectors;
2020

2121
public class ApiVerticle extends AbstractVerticle {
22-
//private Logger log = LogManager.getLogger(this.getClass());
22+
private Logger log = LogManager.getLogger(this.getClass());
2323

2424
@Override
2525
public void start(Future<Void> startFuture) {
@@ -30,9 +30,9 @@ public void start(Future<Void> startFuture) {
3030
router.get("/favicon.ico").handler(c -> c.fail(404)); // 针对浏览器返回404
3131
router.get("/log").handler(this::showLog); // 显示日志
3232
router.routeWithRegex("/([a-z0-9/]*)\\.?(txt|json|png|svg|)")
33-
.handler(this::handleGushici); // 核心API调用
33+
.handler(this::handleGushici); // 核心API调用
3434
router.route().last().handler(c -> c.fail(404)) // 其他返回404
35-
.failureHandler(this::returnError); // 对上面所有的错误进行处理
35+
.failureHandler(this::returnError); // 对上面所有的错误进行处理
3636
vertx
3737
.createHttpServer()
3838
.requestHandler(router::accept)
@@ -53,7 +53,7 @@ private void handleRoot(RoutingContext routingContext) {
5353
JsonObject result = new JsonObject();
5454
result.put("welcome", "欢迎使用古诗词·一言");
5555
result.put("api-document", "下面为本API可用的所有类型,使用时,在链接最后面加上 .svg / .txt / .json / .png 可以获得不同格式的输出");
56-
result.put("help", "具体安装方法请访问项目首页 https://gushi.ci");
56+
result.put("help", "具体安装方法请访问项目首页 " + config().getString("index.url", "http://localhost/"));
5757
vertx.eventBus().<JsonArray>send(Key.GET_HELP_FROM_REDIS, null, res -> {
5858
if (res.succeeded()) {
5959
result.put("list", res.result().body());
@@ -177,6 +177,7 @@ private void log(RoutingContext routingContext) {
177177

178178
/**
179179
* 根据 uri 获取参数
180+
*
180181
* @param routingContext example: uri: /shenghuo/buyi.png , /all
181182
* @return {format: "png", categories: [shenghuo, buyi]}, {format:"json", categories:[""]}
182183
*/
@@ -186,11 +187,10 @@ private Future<JsonObject> parseURI(RoutingContext routingContext) {
186187
String rawCategory = routingContext.request().getParam("param0");
187188
String rawFormat = routingContext.request().getParam("param1");
188189
// 如果是 "all" 则当没有分类处理
189-
JsonArray categories = new JsonArray(
190-
Arrays.stream(rawCategory.split("/"))
191-
.filter(s -> !s.isEmpty())
192-
.filter(s -> !"all".equals(s))
193-
.collect(Collectors.toList()));
190+
JsonArray categories = Arrays.stream(rawCategory.split("/"))
191+
.filter(s -> !s.isEmpty())
192+
.filter(s -> !"all".equals(s))
193+
.collect(JsonCollector.toJsonArray());
194194
// 默认 json
195195
String format = "".equals(rawFormat) ? "json" : rawFormat;
196196

@@ -200,4 +200,4 @@ private Future<JsonObject> parseURI(RoutingContext routingContext) {
200200
result.complete(pathParams);
201201
return result;
202202
}
203-
}
203+
}

src/main/java/ma/luan/yiyan/service/DataService.java

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.vertx.redis.RedisOptions;
1313
import ma.luan.yiyan.constants.Key;
1414
import ma.luan.yiyan.util.CategoryTrie;
15+
import ma.luan.yiyan.util.JsonCollector;
1516
import org.apache.logging.log4j.LogManager;
1617
import org.apache.logging.log4j.Logger;
1718

@@ -41,11 +42,11 @@ public void start(Future<Void> startFuture) {
4142
CompositeFuture.all(Arrays.asList(imgKeys, jsonKeys)).setHandler(v -> {
4243
if (v.succeeded()) {
4344
imgKeys.result().addAll(jsonKeys.result())
44-
.stream()
45-
.forEach(key -> keysInRedis.insert((String) key));
45+
.stream()
46+
.forEach(key -> keysInRedis.insert((String) key));
4647
startFuture.complete();
4748
} else {
48-
log.error(v.cause());
49+
log.error("DataService fail to start", v.cause());
4950
startFuture.fail(v.cause());
5051
}
5152
});
@@ -55,21 +56,17 @@ private void getHelpFromRedis(Message message) {
5556
redisClient.lrange(Key.REDIS_HELP_LIST, 0, -1, res -> {
5657
if (res.succeeded()) {
5758
JsonArray array = res.result();
58-
JsonArray newArray = new JsonArray(array.stream()
59+
JsonArray newArray = array.stream()
5960
.map(text -> {
60-
// 无力吐槽 JsonArray 的 stream 操作
61-
JsonObject result = new JsonObject();
62-
String prefix = config().getString("index.url", "http://localhost/");
63-
new JsonObject((String) text).stream()
64-
.forEach(entry -> result.put(entry.getKey(), prefix +
65-
entry.getValue().toString().replace(":", "/")));
66-
return result;
61+
String prefix = config().getString("api.url", "http://localhost/");
62+
return new JsonObject((String) text).stream()
63+
.collect(Collectors.toMap(Map.Entry::getKey,
64+
v -> prefix + v.getValue().toString().replace(":", "/")));
6765
})
68-
.collect(Collectors.toList())
69-
);
66+
.collect(JsonCollector.toJsonArray());
7067
message.reply(newArray);
7168
} else {
72-
log.error(res.cause());
69+
log.error("Fail to get data from Redis", res.cause());
7370
message.fail(500, res.cause().getMessage());
7471
}
7572
});
@@ -80,8 +77,8 @@ private void getHelpFromRedis(Message message) {
8077
*/
8178
private void getGushiciFromRedis(Message<JsonObject> message) {
8279
JsonArray realCategory = new JsonArray()
83-
.add("png".equals(message.body().getString("format")) ? "img" : "json")
84-
.addAll(message.body().getJsonArray("categories"));
80+
.add("png".equals(message.body().getString("format")) ? "img" : "json")
81+
.addAll(message.body().getJsonArray("categories"));
8582
checkAndGetKey(realCategory)
8683
.compose(key -> Future.<String>future(s -> redisClient.srandmember(key, s))) // 从 set 随机返回一个对象
8784
.setHandler(res -> {
@@ -103,11 +100,7 @@ private void getGushiciFromRedis(Message<JsonObject> message) {
103100
*/
104101
private Future<String> checkAndGetKey(JsonArray categories) {
105102
Future<String> result = Future.future();
106-
List<String> categoryList = categories.stream()
107-
.filter(String.class::isInstance)
108-
.map(String.class::cast)
109-
.collect(Collectors.toList());
110-
List<String> toRandom = keysInRedis.getKeys(categoryList);
103+
List<String> toRandom = keysInRedis.getKeys(categories);
111104
if (toRandom.size() >= 1) {
112105
result.complete(toRandom.get(random.nextInt(toRandom.size())));
113106
} else {

src/main/java/ma/luan/yiyan/service/LogService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ public void start(Future<Void> startFuture) {
3838
private void setHistoryToRedis(Message<JsonObject> message) {
3939
redisClient.hincrby(Key.REDIS_CLICKS_HISTORY_HASH, LocalDate.now().toString(), 1, res -> {
4040
if (res.failed()) {
41-
log.error(res.cause());
41+
log.error("Fail to get data from Redis", res.cause());
4242
}
4343
});
4444
redisClient.hincrby(Key.REDIS_CLICKS_TOTAL_HASH, "total", 1, res -> {
4545
if (res.failed()) {
46-
log.error(res.cause());
46+
log.error("Fail to get data from Redis", res.cause());
4747
}
4848
});
4949
}

src/main/java/ma/luan/yiyan/util/CategoryTrie.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ public void insert(String categoryKey) {
3535
* @param categories example: [img]
3636
* @return [img:test:qq, img:test:aa, img:xx:aa]
3737
*/
38-
public List<String> getKeys(List<String> categories) {
38+
public List<String> getKeys(Iterable categories) {
3939
CategoryTrie currentTrie = this;
40-
if (categories == null || categories.size() == 0) {
40+
if (categories == null) {
4141
return new ArrayList<>();
4242
}
43-
for (String category : categories) {
44-
currentTrie = currentTrie.getDict().getOrDefault(category, EMPTY_INSTANCE);
43+
for (Object category : categories) {
44+
if (category instanceof String) {
45+
currentTrie = currentTrie.getDict().getOrDefault(category, EMPTY_INSTANCE);
46+
}
4547
}
4648
return currentTrie.keys;
4749
}
@@ -67,4 +69,4 @@ public static void main(String[] args) {
6769
System.out.println(root.getKeys(Arrays.asList("img","test")));
6870
System.out.println(root.getKeys(Arrays.asList("img","test2","qq2")));
6971
}
70-
}
72+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ma.luan.yiyan.util;
2+
3+
import io.vertx.core.json.JsonArray;
4+
import io.vertx.core.json.JsonObject;
5+
6+
import java.util.List;
7+
import java.util.function.Supplier;
8+
import java.util.stream.Collector;
9+
10+
public class JsonCollector {
11+
public static Collector<Object, JsonArray, JsonArray> toJsonArray() {
12+
return Collector.of(
13+
JsonArray::new,
14+
JsonArray::add,
15+
JsonArray::add
16+
);
17+
}
18+
}

src/main/resources/conf.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"http.port" : 8080,
3-
"index.url" : "https://api.gushi.ci/",
3+
"api.url" : "https://api.gushi.ci/",
4+
"index.url" : "https://gushi.ci/",
45
"redis": {
56
"host": "127.0.0.1",
67
"port": 6379,

src/main/resources/log4j2.properties

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,6 @@ appender.rolling.strategy.delete.ifLastModified.type = IfLastModified
3636
# Delete files older than 30 days
3737
appender.rolling.strategy.delete.ifLastModified.age = 30d
3838

39-
# Mention package name here in place of example. Classes in this package or subpackages will use ConsoleAppender and RollingFileAppender for logging
40-
#logger.example.name = example
41-
#logger.example.level = debug
42-
#logger.example.additivity = false
43-
#logger.example.appenderRef.rolling.ref = fileLogger
44-
#logger.example.appenderRef.console.ref = consoleLogger
45-
4639
# Configure root logger for logging error logs in classes which are in package other than above specified package
4740
rootLogger.level = debug
4841
rootLogger.additivity = false

0 commit comments

Comments
 (0)