5

通常我会这样做:

if not memcache.get('mykey'):
   memcache.set('mykey', item)

但是,今天我看到了memcache.add(),它似乎仅在项目尚不存在时才添加项目。那么这是否等同于我上面的代码?我可以用 替换上面的代码memcache.add()吗?

此外,更重要的是,我正在使用 AppStats,并且在 RPC 调用跟踪下,我可以查看我的请求是否调用memcache.set()orget()datastore.put()or get()。使用上面的 2 行代码时,我看不到任何memcache.set(),这是预期的。但是,即使返回 false(意味着未插入新项目) ,仅使用memcache.add()(不检查项目是否已存在)总是调用。为什么会这样?memcache.set()memcache.add()

4

1 回答 1

5

您当前的代码有一个竞争条件:在检查内存缓存中是否存在值并插入它之间,另一个进程可能已经插入了一个值,您现在将覆盖该值。使用memcache.add不会受到这种竞争条件的影响。

我不确定你的第二个问题是什么意思;调用memcache.add应该只导致 add 调用,而不是 set 调用。你能包括你在这种情况下运行的代码吗?

于 2012-11-06T12:08:42.087 回答