2012-11-05 11 views
5

Di solito lo faccio:Utilizzando memcache.add() al posto del set()

if not memcache.get('mykey'): 
    memcache.set('mykey', item) 

Tuttavia, oggi ho visto memcache.add(), che sembra aggiungere un elemento solo se non esiste già. Quindi questo è equivalente al codice che ho sopra? Posso semplicemente sostituire il codice sopra con memcache.add()?

Inoltre, e cosa più importante, sto usando AppStats, e sotto RPC Tracce di chiamata, ottengo di vedere se la mia richiesta chiama memcache.set() o get() o datastore.put() o get(). Quando si utilizzano le 2 righe di codice sopra, non vedo nulla per memcache.set(), che è previsto. Tuttavia, utilizzando solo memcache.add() (senza verificare se l'elemento esiste già) chiama sempre memcache.set(), anche se memcache.add() ha restituito false (ovvero non è stato inserito un nuovo elemento). Perché è così?

+0

Dovresti dare un'occhiata al [codice sorgente] (http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/memcache/__init__.py#761 :) :) –

+0

@PaoloMoretti grazie per il link..che cosa esattamente sto cercando .. – Snowman

+0

Questa domanda (o una simile) è già stata richiesta su StackOverflow prima, vorrei dirigerti anche tu - http: // StackOverflow. it/questions/2678339/memcached-which-is-faster-doing-an-add-and-checking-result-or-doing-a-get - http://serverfault.com/questions/291681/add-vs- set-in-memcached –

risposta

3

Il codice corrente ha una condizione di competizione: tra il controllo della presenza di un valore in memcache e l'inserimento di esso, un altro processo potrebbe aver inserito un valore, che ora sovrascriverete. L'utilizzo di memcache.add non soffre di questa condizione di gara.

Non sono sicuro di cosa intendi con la tua seconda domanda; chiamando memcache.add dovrebbe risultare solo in una chiamata aggiunta, mai una chiamata impostata. Puoi includere il codice che stai utilizzando in quel caso?

+1

Per essere chiari, se hai appena cambiato 'set()' in 'add()' c'è ancora la possibilità di una collisione tra chiavi, è solo che con 'add()' tu ' Lo sapremo tramite il suo valore di ritorno? –

Problemi correlati