【问题标题】:Using memcache.add() instead of set()使用 memcache.add() 而不是 set()
【发布时间】:2012-11-05 14:53:21
【问题描述】:

通常我会这样做:

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

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

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

【问题讨论】:

标签: python google-app-engine memcached


【解决方案1】:

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

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

【讨论】:

  • 要明确一点,如果您只是将set() 更改为add(),仍然有可能发生密钥冲突,只是add() 您会通过它的返回值知道它吗?
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 2018-10-31
  • 2016-05-30
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多