(Google AppEngine)Memcache Lock Entry

时间:2010-02-11 15:00:09

标签: google-app-engine locking memcached

我需要锁定内存缓存。由于所有操作都是原子的,因此应该是一件容易的事。我的想法是使用基本的自旋锁机制。因此,需要在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

4 个答案:

答案 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,用于检查此锁的状态,如果空闲,则执行您希望它执行的任何操作。