2012-11-05 96 views
5

通常我做:使用memcache.add()而不是set()

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

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

而且,更重要的是,我将Appstats,并在RPC调用跟踪,我去看看我的请求调用memcache.set()get()datastore.put()get()。当使用上面的两行代码时,我没有看到任何memcache.set(),这是预期的。但是,仅使用memcache.add()(不检查项目是否已存在)始终会调用memcache.set(),即使memcache.add()返回false(表示未插入新项目)。为什么会这样?

+0

您应该查看[源代码](http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/memcache/__init__.py#761 ):) –

+0

@PaoloMoretti谢谢你的链接..我正在找什么.. – Snowman

+0

这个问题(或者一个类似的)已经被问到在stackoverflow之前,我想指导你 - http:// stackoverflow。 com/questions/2678339/memcached-which-is-faster-doing-an-add-and-checking-result-or-doing-a-get - http://serverfault.com/questions/291681/add-vs- set-in-memcached –

回答

3

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

我不确定你的第二个问题是什么意思;拨打电话memcache.add只会导致增加呼叫,而不会导致设定的呼叫。你能包括你在这种情况下运行的代码吗?

+1

要清楚的是,如果你只是将'set()'改为'add()',那么仍然存在键冲突的可能性,这只是用'add()'你'通过它的返回值了解它吗? –

相关问题