Skip to content

Commit 7bfa46c

Browse files
committed
perf(chatroom): 优化金属头像生成性能
- 添加 metalCache 同步映射,用于缓存生成的金属头像 - 实现了基于参数字符串的缓存机制,避免重复生成相同头像 - 限制缓存大小为 2000 条目,超出后自动移除最旧的缓存项
1 parent e644d05 commit 7bfa46c

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

src/main/java/org/b3log/symphony/processor/ChatroomProcessor.java

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.jsoup.nodes.Element;
5656
import org.jsoup.safety.Whitelist;
5757
import org.jsoup.select.Elements;
58+
import pers.adlered.simplecurrentlimiter.cache.pair.CachePair;
5859
import pers.adlered.simplecurrentlimiter.main.SimpleCurrentLimiter;
5960

6061
import java.math.BigDecimal;
@@ -194,8 +195,6 @@ public class ChatroomProcessor {
194195

195196
public static String barragerUnit = "积分";
196197

197-
198-
199198
/**
200199
* Register request handlers.
201200
*/
@@ -222,22 +221,35 @@ public static void register() {
222221
Dispatcher.get("/gen", chatroomProcessor::genMetal, loginCheck::handle);
223222
}
224223

224+
public static Map<String, String> metalCache = Collections.synchronizedMap(new LinkedHashMap<String, String>() {
225+
@Override
226+
protected boolean removeEldestEntry(Map.Entry eldest) {
227+
return size() > 2000;
228+
}
229+
});
225230
public void genMetal(final RequestContext context) {
226231
Set<String> params = context.getRequest().getParameterNames();
227232
String paramString = "";
228233
for (String param : params) {
229234
paramString += param + "=" + context.getRequest().getParameter(param) + "&";
230235
}
231236
paramString = "?" + paramString.substring(0, paramString.length() - 1);
232-
String genUrl = Symphonys.get("gen.metal.url") + paramString;
233-
final HttpRequest req = HttpRequest.get(genUrl).header(Common.USER_AGENT, Symphonys.USER_AGENT_BOT);
234-
final HttpResponse res = req.connectionTimeout(3000).timeout(5000).send();
235-
res.close();
236-
if (200 != res.statusCode()) {
237-
context.sendError(500);
238-
return;
237+
String body = "";
238+
if (!metalCache.containsKey(paramString)) {
239+
String genUrl = Symphonys.get("gen.metal.url") + paramString;
240+
final HttpRequest req = HttpRequest.get(genUrl).header(Common.USER_AGENT, Symphonys.USER_AGENT_BOT);
241+
final HttpResponse res = req.connectionTimeout(3000).timeout(5000).send();
242+
res.close();
243+
if (200 != res.statusCode()) {
244+
context.sendError(500);
245+
return;
246+
}
247+
body = res.charset("utf-8").bodyText();
248+
metalCache.put(paramString, body);
249+
} else {
250+
body = metalCache.get(paramString);
239251
}
240-
String body = res.charset("utf-8").bodyText();
252+
241253
context.getResponse().setContentType("image/svg+xml");
242254
context.getResponse().sendBytes(body.getBytes());
243255
}

0 commit comments

Comments
 (0)