我使用Memcached (使用spymemcached作为客户端)缓存来自远程服务器的响应。我的程序的逻辑很简单:
这个程序就像,
Object cachedResource = spyMemcachedClient.get(RESOURCE_KEY);
if (cachedResource != null) {
return cachedResource;
} else {
Object remoteResource = getTheResourceFromTheRemoteServer();
spyMemcachedClient.set(RESOURCE_KEY, EXP_TIME, remoteResource);
return remoteResource;
}
但是我注意到,由于同时会有许多并发请求,可能两个线程都发现cachedResource
是null
,所以它们都调用getTheResourceFromTheRemoteServer
,我不想这样做。
所以我怎么才能避免这种情况。在spymemcached中是否有类似于ConcurrentMap.putIfAbsent
的原子操作。(顺便说一句,该程序将部署在多个实例上,这意味着不可能使用像Lock这样的Java并发实用程序来实现这一点。)
发布于 2014-04-22 05:42:07
memcached中有add
命令,它可以满足您的需要(命令列表)。为了避免调用两次或更多次getTheResourceFromTheRemoteServer
,您应该使用memcached ( add
和delete
命令的组合)来模拟写锁。因此,只有成功调用同一特定键上的add
(RESOURCE_KEY_LOCK)的线程才应该调用getTheResourceFromTheRemoteServer
并将其放入缓存中。其他线程应该等待并再次调用get(RESOURCE_KEY)
https://stackoverflow.com/questions/23191364
复制相似问题