Vous avez déjà à peu près la réponse à votre première question: l'intention de ADD
est de ne fonctionner que lorsqu'une clé n'existe pas déjà, alors qu'il SET
est là pour mettre à jour la valeur, qu'elle existe déjà ou non. Si vous êtes familier avec SQL, c'est (à peu près) comme la différence entre les INSERT
requêtes ( ADD
) et UPDATE
( SET
).
En ce qui concerne votre question addenda, vous utiliseriez celui qui convient à votre objectif. Je dirais que ce SET
serait l'opération la plus courante, car il est plus courant que vous vouliez simplement dire "Je veux que la clé foo
ait de la valeur bar
, et je me fiche de savoir si elle était déjà là". Cependant, il y aurait des occasions (moins fréquentes) où il serait nécessaire de savoir qu'une clé n'est pas déjà dans le cache.
Un exemple qui me vient à l'esprit quand il ADD
serait approprié est de stocker des sessions dans memcache (ce que je ne recommande d'ailleurs pas) - si vous générez vos identifiants de session de manière aléatoire (ou via le hachage), vous ne voudriez pas pour créer une nouvelle session avec la même clé qu'une session existante, car cela permettrait à un utilisateur d'accéder aux données d'un autre utilisateur. Dans ce cas, lorsque vous avez créé la session que vous utiliseriez ADD
et si elle renvoyait un état d'échec, vous devez générer un nouvel ID de session et réessayer. La mise à jour de la session, bien sûr, serait alors utilisée SET
pendant que l'utilisateur se frayait un chemin dans votre application.
REPLACE
n'est même pas du SQL ... c'est "le langage vaguement inspiré du SQL que MySQL comprend" (sourire)En plus de la réponse ci-dessus par l'ID utilisateur 'womble', veuillez également considérer les points suivants:
Possibilité d'une condition de concurrence avec 'set' par opposition à 'add'. Voir ci-dessous le lien vers une réponse de Nick Johnson: /programming/13234556/using-memcache-add-instead-of-set
Si vous savez que «ajouter» fera l'affaire, alors n'utilisez pas «set». C'est pour éviter d'envoyer des données sur le réseau car ce sont des appels RPC . Et pratiquement tout le temps est consommé par le trafic réseau au lieu de rechercher une paire clé-valeur dans memcache. Donc, si vous pouvez éviter le trafic réseau qui est le meilleur, comme dans ce cas, votre temps de réponse sera plus rapide.
Voir Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (par Google)) et pour mieux comprendre le point # 2 ci-dessus, veuillez regarder http://www.youtube.com/watch ? v = bvp7CuBWVgA par Guido Van Rossum (@Google)
la source