gpt4 book ai didi

Java REST 优化数据结构访问

转载 作者:行者123 更新时间:2023-12-02 01:42:22 25 4
gpt4 key购买 nike

我有一个 Java REST 应用程序,其中一个端点始终处理 ConcurrentMap。我正在做负载测试,当负载测试开始增加时,情况真的很糟糕。

我可以实现哪些策略来提高应用程序的效率?

我应该使用 Jetty 线程吗,因为它是我正在使用的服务器?还是主要是代码?或者两者兼而有之?

成为瓶颈的方法是下面的方法。

基本上我需要从给定文件中读取一些行。我无法将其存储在数据库中,因此我想出了用 Map 进行此处理。但是,我知道对于大文件,不仅需要很长时间才能到达该行,而且我冒着这样的风险:本地图有很多条目时,它会消耗大量内存......

dictConcurrentMap

public String getLine(int lineNr) throws IllegalArgumentException {
if (lineNr > nrLines) {
throw new IllegalArgumentException();
}

if (dict.containsKey(lineNr)) {
return dict.get(lineNr);
}

synchronized (this) {
try (Stream<String> st = Files.lines(doc.toPath())

Optional<String> optionalLine = st.skip(lineNr - 1).findFirst();

if (optionalLine.isPresent()) {
dict.put(lineNr, optionalLine.get());
} else {
nrLines = nrLines > lineNr ? lineNr : nrLines;
throw new IllegalArgumentException();
}

} catch (IOException e) {
e.printStackTrace();
}

return cache.get(lineNr);
}

最佳答案

ConcurrentMapsynchronized(this) 混合可能不是正确的方法。 java.util.concurrent 包中的类专为特定用例而设计,并尝试在内部优化同步。

相反,我建议首先尝试设计良好的缓存库,看看性能是否足够好。一个例子是 Caffeine 。根据Population文档它为您提供了一种声明如何加载数据的方法,甚至是异步的:

AsyncLoadingCache<Key, Graph> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
// Either: Build with a synchronous computation that is wrapped as asynchronous
.buildAsync(key -> createExpensiveGraph(key));
// Or: Build with a asynchronous computation that returns a future
.buildAsync((key, executor) -> createExpensiveGraphAsync(key, executor));

关于Java REST 优化数据结构访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com