5

通常、私は:

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

しかし、今日memcache.add()、アイテムがまだ存在しない場合にのみアイテムを追加するように見える を見ました。これは上記のコードと同等ですか?上記のコードを に置き換えることはできますmemcache.add()か?

また、さらに重要なことに、私は AppStats を使用しており、RPC Call Traces の下で、リクエストがmemcache.set()orget()またはdatastore.put()orを呼び出しているかどうかを確認できget()ます。上記の 2 行のコードを使用すると、予期される に対して何も表示されませんmemcache.set()。ただし、 only memcache.add()(項目が既に存在するかどうかを確認せずに) を使用すると、 false が返さmemcache.set()れても (新しい項目が挿入されなかったことを意味します)、常に が呼び出されます。memcache.add()これはなぜですか?

4

1 に答える 1

5

現在のコードには競合状態があります。memcache 内の値の存在を確認してから挿入するまでの間に、別のプロセスが値を挿入した可能性があり、それを上書きします。使用memcache.addしても、この競合状態に悩まされることはありません。

2 番目の質問の意味がわかりません。呼び出しmemcache.addは add 呼び出しのみになり、set 呼び出しにはなりません。その場合、実行しているコードを含めることができますか?

于 2012-11-06T12:08:42.087 に答える