我正在使用Memcached(使用spymemcached作为客户端)来缓存从远程服务器收到的响应。 我的程序的逻辑很简单:

  • 如果请求的资源已缓存在Memcached中,请立即返回缓存;
  • 如果不是,请连接到远程服务器,对其进行缓存,然后返回结果。

该程序是这样的,

Object cachedResource = spyMemcachedClient.get(RESOURCE_KEY);
if (cachedResource != null) {
    return cachedResource;
} else {
    Object remoteResource = getTheResourceFromTheRemoteServer();
    spyMemcachedClient.set(RESOURCE_KEY, EXP_TIME, remoteResource);
    return remoteResource;
}

但我注意到,由于将同时存在多个并发请求,因此两个线程都可能发现cachedResourcenull ,因此它们都调用了我不想使用的getTheResourceFromTheRemoteServer

因此,如何避免这种情况。 spymemcached中是否有像ConcurrentMap.putIfAbsent这样的原子操作。 (顺便说一句,该程序将部署在多个实例上,这意味着不可能使用Java并发utils(例如Lock)来实现这一点。)

===============>>#1 票数:1 已采纳

memcached中有add命令可以执行您想要的操作( 命令列表 )。 为避免调用两次或两次以上的getTheResourceFromTheRemoteServer ,应使用memcached( adddelete命令的组合)模拟写锁。 因此,只有成功调用同一特定键(RESOURCE_KEY_LOCK)上的add的线程才应调用getTheResourceFromTheRemoteServer并将其放入缓存。 其他线程应等待并再次调用get(RESOURCE_KEY)

  ask by Wenhao Ji translate from so

未解决问题?本站智能推荐: