向大家问好!我要休息一下,以运动衫为基础,申请。此应用程序(由于其客户端的性质)在大致相同的时间(~2-5秒之间)接收相同的http请求(其中3-6个)。每个请求大约需要10秒来处理并带回大量数据(命中DB、执行数据按摩等)。在理想的世界中,我希望避免多次处理相同的请求,并考虑编写某种只允许唯一请求通过的请求筛选器,直到允许的请求返回时,其他请求才会被阻塞。阻塞的请求也将返回相同的数据给调用者(通过在服务器上查找缓存的响应)。
这种方法的优缺点是什么?除了改变客户端逻辑之外,还有其他更好的解决方案吗?)
发布于 2015-08-02 23:41:11
您可以为每个“键”创建一个要锁定的唯一对象。其中键是一些请求参数,在本例中是一个String。这样,您只需保持请求(因为同步),一旦计算完成,两个客户端大约同时获得结果。这样,客户端就不必发出多个请求,而不是首先要等待第一个客户端以缓存为主的客户端。
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
public class Hold {
private ConcurrentHashMap<String, String> holds =
new ConcurrentHashMap<>(new HashMap<String, String>());
// compose a "hash" for lack of better word, could append a timeout as well
public String hashString (String string) {
return string + "wackystuff";
}
public String doLongComputation () {
// do crazy computation here
return new String();
}
public synchronized String getResults (String key) {
// give us a unique object for this key to lock on
holds.putIfAbsent(key, hashString(key));
// lock on that key
synchronized (holds.get(key)) {
// we have a non lock value so return it
if (!holds.get(key).equals(hashString(key))) {
// could do some timeout here
return holds.get(key);
}
// the cache is empty so do the long computation
holds.put(key, doLongComputation());
}
return holds.get(key);
}
}这只是一种狡猾的方法,在实践中的Java并发性一书中,有更健壮的方法,它在第5.19节中,代码示例可以找到这里。
以下是这种方法的优缺点:
发布于 2017-06-16 11:37:15
在开发与多个REST服务的集成过程中,为了避免不必要的对服务的调用,我们在接收到的响应(JSON字符串)数据库中创建了一个cash。
对于每一个这样的现金记录,我们都会保存用于调用web服务的params。如果我们有一个请求,我们比较了参数与数据库中现有的。我们提出真正的请求,只为新的帕拉姆休息。另外,对我们来说也是必要的,因为有些要求不是免费的。
此外,我们还有一个param,它显示每个现金记录的验证日期(以小时(或数天)计),这样在一段时间后,如果很久以前就提出了接收免费信息的请求,我们就会自动提出一个真正的请求。
这种方法是在使用REST服务几年后创建的,它在我们的解决方案中运行得非常好。
https://stackoverflow.com/questions/31777442
复制相似问题