web-dev-qa-db-ja.com

Memcachedでの追加と設定

ADDとSET Anyの違いがわかりません。 ADDにSETが含まれているか、何かが存在し、SETが上書きするだけでADDがfalseを返すようです。ありがとう!

編集:私の特定の質問は、「セットではなく追加を使用するのか、追加ではなくセットを使用するのか」です。

17
user851171

すでに最初の質問に対する答えはほぼわかっています。ADDの目的は、キーがまだ存在しない場合にのみ機能することですが、SETは値を更新するためのものです。それがすでに存在するかどうかに関係なく。 SQLに精通している場合、それは(おおよそ)INSERTクエリ(ADD)とUPDATESET)の違いに似ています。

補遺の質問に関しては、目的に合った方を使用します。 SETの方がより一般的な操作だと思います。「キーfooに値barを指定して、すでにそこにあったかどうかは気にしない」と語った。ただし、キーがまだキャッシュにないことを知る必要がある場合があります(それほど頻繁ではありません)。

ADDが適切な場合に頭に浮かぶ例は、セッションをmemcacheに保存することです(ところで、これはお勧めしません)-セッションIDをランダムに(またはハッシュを介して)生成している場合、あるユーザーに別のユーザーのデータへのアクセスを許可するため、既存のセッションと同じキーで新しいセッションを作成することは望ましくありません。この場合、セッションを作成したときにADDを使用し、失敗のステータスを返した場合は、新しいセッションIDを生成して再試行する必要があります。もちろん、セッションを更新すると、ユーザーがアプリケーションを操作するときにSETが使用されます。

22
womble

上記のuser-id 'womble'による回答に加えて、次の点も考慮してください。

  1. レース条件の可能性は、 'add'ではなく 'set'です。ニックジョンソンによる回答への以下のリンクを参照してください。 https://stackoverflow.com/questions/13234556/using-memcache-add-instead-of-set

  2. 「追加」が機能することがわかっている場合は、「セット」を使用しないでください。これはRPC呼び出しであるため、ネットワーク経由でデータを送信しないようにするためです。また、memcacheでキーと値のペアを探すのではなく、ほぼすべての時間がネットワークトラフィックで消費されます。したがって、そのような場合に最適なネットワークトラフィックを回避できれば、応答時間が速くなります。


Appstats( https://developers.google.com/appengine/docs/python/tools/appstats (by Google))を参照し、上記のpoint#2についてさらに理解するには、以下をご覧ください http://www.youtube.com/watch?v=bvp7CuBWVgA by Guido Van Rossum(@Google)

3
dev-vb