Aggiungi vs Imposta in Memcached


17

Non capisco la differenza tra ADD e SET Qualche indizio? Sembra che ADD includa SET o che ADD restituisca false se c'è qualcosa e SET sovrascrive. Grazie!

EDIT: La mia domanda specifica è "Quando usi aggiungi anziché impostare o impostare anziché aggiungere?"

Risposte:


22

Hai praticamente già ottenuto la risposta alla tua prima domanda: l'intento ADDè di lavorare solo quando una chiave non esiste già, mentre SETè lì per aggiornare il valore, indipendentemente dal fatto che esista già. Se hai familiarità con SQL, è (approssimativamente) come la differenza tra INSERTquery ( ADD) e UPDATE( SET).

Per quanto riguarda la tua domanda di addendum, useresti quello che si adatta al tuo scopo. Direi che SETsarebbe l'operazione più comune, perché è più comune che tu voglia semplicemente dire "Voglio che la chiave fooabbia il valore bare non mi interessa se è già presente o meno". Tuttavia, ci sarebbero (meno frequenti) occasioni in cui sarebbe necessario sapere che una chiave non è già nella cache.

Un esempio che viene in mente quando ADDsarebbe appropriato è la memorizzazione di sessioni in memcache (che, a proposito, non lo consiglio) - se stai generando i tuoi ID di sessione in modo casuale (o tramite hashing), non vorrai per creare una nuova sessione con la stessa chiave di una esistente, in quanto ciò consentirebbe a un utente di accedere ai dati di un altro utente. In questo caso, quando hai creato la sessione che utilizzeresti ADDe se restituiva uno stato di errore, devi generare un nuovo ID di sessione e riprovare. L'aggiornamento della sessione, ovviamente, verrebbe quindi utilizzato SETmentre l'utente si faceva strada attraverso l'applicazione.


1
Potrei essere un po 'pignolo qui, ma nel tuo confronto con SQL, se "aggiungi" confronta a INSERISCI, "imposta" comparerebbe a SOSTITUISCI piuttosto che AGGIORNARE.
Matteo

2
Da qui l'uso della parola "approssimativamente". Se vuoi diventare davvero pignolo, REPLACEnon è nemmeno SQL ... è "il linguaggio vagamente ispirato da SQL che MySQL capisce" (ghigno)
womble

3

Oltre alla risposta di cui sopra, id-user "womble", ti preghiamo di considerare anche i seguenti punti:

  1. Possibilità di una condizione di gara con 'set' anziché con 'add'. Vedi sotto il link a una risposta di Nick Johnson: /programming/13234556/using-memcache-add-instead-of-set

  2. Se sai che lo farà "aggiungi", quindi non usare "set". Questo per evitare di inviare dati sulla rete poiché si tratta di chiamate RPC . E praticamente quasi tutto il tempo viene consumato dal traffico di rete invece di cercare una coppia chiave-valore in memcache. Quindi, se riesci a evitare il traffico di rete che è meglio come in quel caso, il tempo di risposta sarà più veloce.


Vedi Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (di Google)) e per capire il punto 2 sopra, per favore guarda http://www.youtube.com/watch ? v = bvp7CuBWVgA di Guido Van Rossum (@Google)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.