首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态变量作为缓存可能出现的问题

静态变量作为缓存可能出现的问题
EN

Stack Overflow用户
提问于 2022-07-24 14:28:05
回答 1查看 185关注 0票数 2

我有一个具有以下用例的场景:

  1. 函数someFunctionToGetValue需要大约10秒的时间来处理。
  2. api被称为每秒300个请求。
  3. 这个api的数据对于所有用户都是一样的。
  4. 数据很少变化。

g 210

为了处理吞吐量,我使用静态变量作为缓存,每10分钟刷新一次。

代码语言:javascript
复制
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?

  • Any中使用静态变量作为缓存的
  1. 缺点
EN

回答 1

Stack Overflow用户

发布于 2022-07-26 09:30:58

在两个调用之间可能存在一个争用条件,第一个调用查询为空的value,在执行重someFunctionToGetValue时,第二个调用仍然将value视为null。

这对你来说可能不是问题,但是如果你想确保这个值只计算了一次,你就可以使用回忆录的过期(比如番石榴的)

代码语言:javascript
复制
Supplier<String> memoizedSupplier = Suppliers.memoizeWithExpiration(
  CostlySupplier::generateBigNumber, 5, TimeUnit.SECONDS);

此外,由于资源是单例的,因此值参数不需要是静态的,因为它只实例化一次。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73099272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档