2009-05-21 15 views
10

Questo è specificamente correlato all'API Memcache di Google App Engine, ma sono sicuro che si applica anche ad altri strumenti di Memcache.Cosa succede se voglio memorizzare un valore None nel memcache?

Il .get dizionario() metodo consente di specificare un valore predefinito, come ad esempio dict.get ('chiave', 'ValDefault')

Questo può essere utile se è possibile si potrebbe desiderare di memorizzare Nessuno come valore in un dizionario.

Tuttavia, memcache.get() non consente di farlo. Ho modificato il mio @memoize decoratore in modo che assomiglia a questo:

def memoize(keyformat, time=1000000): 

    """Decorator to memoize functions using memcache.""" 
    def decorator(fxn): 
     def wrapper(*args, **kwargs): 
      key = keyformat + str(args[1:]) + str(kwargs) 
      from google.appengine.api import memcache 
      data = memcache.get(key) 
      if Debug(): return fxn(*args, **kwargs) 
      if data: 
       if data is 'None': data = None 
       return data 
      data = fxn(*args, **kwargs) 
      if data is None: data = 'None' 
      memcache.set(key, data, time) 
      return data 
     return wrapper 
    return decorator 

Ora sono sicuro che ci sia un buon argomento che non dovrei memorizzare i valori Nessuno, in primo luogo, ma cerchiamo di metterlo da parte per adesso. C'è un modo migliore in cui posso gestire questo oltre alla conversione di nessun valore in stringhe e ritorno?

risposta

7

Un possibile modo per eseguire questa operazione è creare una nuova classe che definisca None per questo scopo e assegnare le relative istanze alla cache (sfortunatamente non è possibile estendere None). In alternativa, è possibile utilizzare la stringa vuota "" o evitare di memorizzare completamente valori Nessuno/null (l'assenza della chiave implica Nessuno).

quindi controllare istanze della tua classe 'None' quando si controlla il risultato di mc.get(key) (is None, == "", ecc)

+0

Penso che questo sia l'approccio migliore. Ti dà un valore sentinella che non può essere confuso per nient'altro. –

+0

Questo è quello che ho finito per fare. Grazie! – jamtoday

0
Non

davvero.

È possibile memorizzare un valore None come stringa vuota, ma non esiste un modo per memorizzare dati speciali in un memcache.

Qual è la differenza tra la chiave cache non esistente e il valore della cache impostato su Nessuno? Probabilmente è meglio unificare queste due situazioni.

+2

In realtà, può essere utile distinguerli. Ad esempio, supponiamo di avere un (costoso) metodo per autenticare gli utenti e memorizzo in cache i risultati - i dettagli dell'utente - in memcache. Se torno a una risposta "non simile a un utente", probabilmente desidero memorizzare nella cache tale risposta negativa, altrimenti un utente può eseguire il servizio DoS tentando di accedere con nomi utente non validi più e più volte. –

+1

Questo è esattamente il tipo di situazione in cui mi sono trovato. A volte vuoi sapere che una funzione ha restituito "Nessuno" ma anche che è stata eseguita abbastanza di recente in modo che non debba essere eseguita nuovamente. – jamtoday

3

Si potrebbe fare qualcosa come Haskell e Scala e memorizzare un dizionario di opzioni. Il dizionario contiene due chiavi: una chiave per indicare che è valida e una chiave che viene utilizzata per contenere i dati. Qualcosa di simile a questo:

{valid: true, data: whatyouwanttostore} 

Poi, se get ritorno None, si sa che la cache è stato mancato; se il risultato è un dizionario con None come dati, si sa che i dati erano nella cache ma che era falso.

Problemi correlati