Add vs Set in Memcached


17

Ich verstehe den Unterschied zwischen ADD und SET nicht. Irgendwelche Hinweise? Es scheint, als ob ADD SET enthält oder dass ADD false zurückgibt, wenn etwas vorhanden ist und SET nur überschreibt. Vielen Dank!

BEARBEITEN: Meine spezifische Frage lautet: "Wann verwenden Sie Add anstelle von Set oder Set anstelle von Add?"

Antworten:


22

Sie haben so ziemlich schon die Antwort auf Ihre erste Frage: Die Absicht von ADDist, nur dann zu funktionieren, wenn noch kein Schlüssel vorhanden ist, während SETder Wert aktualisiert werden soll, unabhängig davon, ob er bereits vorhanden ist. Wenn Sie mit SQL vertraut sind, entspricht dies (ungefähr) dem Unterschied zwischen den INSERTAbfragen ( ADD) und UPDATE( SET).

In Bezug auf Ihre Zusatzfrage würden Sie das verwenden, was Ihrem Zweck entspricht. Ich würde sagen, dass SETdies die üblichere Operation ist, da es üblicher ist, dass Sie nur sagen möchten, dass der Schlüssel fooden Wert haben soll bar, und es ist mir egal, ob er bereits vorhanden ist oder nicht. In (weniger häufigen) Fällen müsste jedoch bekannt sein, dass sich noch kein Schlüssel im Cache befindet.

Ein Beispiel, das mir in den Sinn kommt, wenn ADDes angebracht wäre, Sitzungen in Memcache zu speichern (was ich übrigens nicht empfehle) - wenn Sie Ihre Sitzungs-IDs zufällig (oder über Hashing) generieren, möchten Sie das nicht Erstellen einer neuen Sitzung mit demselben Schlüssel wie einer vorhandenen Sitzung, da dies einem Benutzer Zugriff auf die Daten eines anderen Benutzers gewähren würde. In diesem Fall müssten Sie beim Erstellen der verwendeten Sitzung ADDeine neue Sitzungs-ID generieren und es erneut versuchen, wenn ein Fehlerstatus zurückgegeben wird. Das Aktualisieren der Sitzung wird dann natürlich verwendet, wenn sich SETder Benutzer durch Ihre Anwendung gearbeitet hat.


1
Ich könnte hier ein bisschen pingelig sein, aber in Ihrem Vergleich mit SQL, wenn "add" mit INSERT verglichen wird, würde "set" eher mit REPLACE als mit UPDATE verglichen werden.
Matteo

2
Daher die Verwendung des Wortes "grob". Wenn Sie wirklich pingelig werden möchten, dann REPLACEist das nicht einmal SQL ... es ist "die Sprache, die von SQL locker inspiriert ist und die MySQL versteht" (
grins

3

Zusätzlich zu der obigen Antwort mit der Benutzer-ID 'womble' sollten Sie auch die folgenden Punkte berücksichtigen:

  1. Möglichkeit einer Racebedingung mit 'Set' im Gegensatz zu 'Add'. Siehe den folgenden Link zu einer Antwort von Nick Johnson: /programming/13234556/using-memcache-add-instead-of-set

  2. Wenn Sie wissen, dass 'add' ausreicht, verwenden Sie nicht 'set'. Dies soll verhindern, dass Daten über das Netzwerk gesendet werden, da dies RPC-Aufrufe sind . Und praktisch die gesamte Zeit wird vom Netzwerkverkehr beansprucht, anstatt im Memcache nach Schlüssel-Wert-Paaren zu suchen. Wenn Sie also Netzwerkverkehr vermeiden können, der am besten geeignet ist, ist Ihre Antwortzeit kürzer.


Siehe Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (von Google)) und zum besseren Verständnis von Punkt 2 http://www.youtube.com/watch ? v = bvp7CuBWVgA von Guido Van Rossum (@Google)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.