我需要锁定内存缓存。由于所有操作都是原子的,因此应该是一件容易的事。我的想法是使用基本的自旋锁机制。因此,需要在memcache中锁定的每个对象都会获得一个锁定对象,该对象将被轮询以进行访问。
// pseudo code
// try to get a lock
int lock;
do
{
lock = Memcache.increment("lock", 1);
}
while(lock != 1)
// ok we got the lock
// do something here
// and finally unlock
Memcache.put("lock", 0);
这样的解决方案如何执行?你有更好的想法如何锁定memcache对象吗?
致以最诚挚的问候,
Friedrich Schick
答案 0 :(得分:4)
小心点。你可能会在那个循环中烧掉很多your quota。
答案 1 :(得分:2)
锁定通常是一个坏主意 - 在您的示例中,将导致占用大量配额的忙等待循环。
你需要锁定什么?也许我们可以建议一个更好的选择。
答案 2 :(得分:1)
如果你真的需要一个循环:不要忙等待,但要包括一个延迟,可能是指数退避:
int delay = 100;
do {
lock = Memcache.increment("lock", 1);
usleep(delay);
delay = min(delay * 2, 100000);
}
while (!lock);
答案 3 :(得分:0)
正如你所说,memcache上的所有操作都是原子的。要回应其他人的回复,请不要在应用引擎上使用天真的自旋锁。您将在大约20分钟内用完每日配额。现在,到您的解决方案:
我做过这样的事情。我创建了一个任务队列,其桶大小为1,执行速率为1 / 10s(每10秒一个任务)。我使用这个队列进行“旋转”,除了它的优点是每10秒只检查一次。我不确定你的用例是什么,但即使每秒执行一次任务也比在循环中旋转要好得多。因此,您实现了一个任务servlet,用于检查此锁的状态,如果空闲,则执行您希望它执行的任何操作。