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(表示未插入新项)。为什么会这样?
答案 0 :(得分:3)
您当前的代码存在竞争条件:在检查memcache中是否存在值并插入它之间,另一个进程可能已插入一个值,您现在将覆盖该值。使用memcache.add
不会受到这种竞争条件的影响。
我不确定你的第二个问题是什么意思;调用memcache.add
应该仅在添加调用中产生,而不是调用set。你可以包括你在这种情况下运行的代码吗?