我有一个具有以下用例的场景:
someFunctionToGetValue需要大约10秒的时间来处理。g 210
为了处理吞吐量,我使用静态变量作为缓存,每10分钟刷新一次。
import javax.ws.rs.PATH;
import com.google.inject.Singleton;
@Path("/home")
@Singleton
class MyResource {
private static String value; //this is actually a complex huge pojo
@Get
public Response getConfigData(){
boolean isMinsLapsed=Calender.getInstance().get(Calender.Minute)%10==0;
if(value==null || isMinsLapsed){
value=someFunctionToGetValue();
}
return value;
}
}需要将这段代码发送到产品中,并对以下几点进行思考。
在上面的scenario?
发布于 2022-07-26 09:30:58
在两个调用之间可能存在一个争用条件,第一个调用查询为空的value,在执行重someFunctionToGetValue时,第二个调用仍然将value视为null。
这对你来说可能不是问题,但是如果你想确保这个值只计算了一次,你就可以使用回忆录的过期(比如番石榴的)
Supplier<String> memoizedSupplier = Suppliers.memoizeWithExpiration(
CostlySupplier::generateBigNumber, 5, TimeUnit.SECONDS);此外,由于资源是单例的,因此值参数不需要是静态的,因为它只实例化一次。
https://stackoverflow.com/questions/73099272
复制相似问题