Sie haben so ziemlich schon die Antwort auf Ihre erste Frage: Die Absicht von ADD
ist, nur dann zu funktionieren, wenn noch kein Schlüssel vorhanden ist, während SET
der 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 INSERT
Abfragen ( ADD
) und UPDATE
( SET
).
In Bezug auf Ihre Zusatzfrage würden Sie das verwenden, was Ihrem Zweck entspricht. Ich würde sagen, dass SET
dies die üblichere Operation ist, da es üblicher ist, dass Sie nur sagen möchten, dass der Schlüssel foo
den 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 ADD
es 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 ADD
eine 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 SET
der Benutzer durch Ihre Anwendung gearbeitet hat.
REPLACE
ist das nicht einmal SQL ... es ist "die Sprache, die von SQL locker inspiriert ist und die MySQL versteht" (Zusätzlich zu der obigen Antwort mit der Benutzer-ID 'womble' sollten Sie auch die folgenden Punkte berücksichtigen:
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
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)
quelle