使用memcache.add()而不是set()

时间:2012-11-05 14:53:22

标签: python google-app-engine memcached

通常我会这样做:

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

但是,今天我看到了memcache.add(),它似乎只在尚未存在的情况下添加项目。那么这相当于我上面的代码吗?我可以用memcache.add()替换上面的代码吗?

此外,更重要的是,我正在使用AppStats,在RPC Call Traces下,我会看到我的请求是memcache.set()还是get()还是datastore.put()还是{{1 }}。当使用上面的两行代码时,我看不到get()的任何内容,这是预期的。但是,仅使用memcache.set()(不检查项是否已存在)始终会调用memcache.add(),即使memcache.set()返回false(表示未插入新项)。为什么会这样?

1 个答案:

答案 0 :(得分:3)

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

我不确定你的第二个问题是什么意思;调用memcache.add应该仅在添加调用中产生,而不是调用set。你可以包括你在这种情况下运行的代码吗?