2009-05-21 3 views
10

Esto está específicamente relacionado con la API de Memcache de Google App Engine, pero estoy seguro de que también se aplica a otras herramientas de Memcache.¿Qué ocurre si deseo almacenar un valor Ninguno en la Memcache?

El .get diccionario() método le permite especificar un valor predeterminado, como dict.get ('llave', 'defaultval')

Esto puede ser útil si es posible, es posible que desee almacenar Ninguno como un valor en un diccionario.

Sin embargo, el memcache.get() no le permite hacer esto. He modificado mi decorador @memoize por lo que se ve así:

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 

Ahora estoy seguro de que hay un buen argumento de que no debería estar almacenar valores Ninguno, en primer lugar, pero vamos a dejar eso de lado para ahora. ¿Hay una mejor manera de manejar esto además de convertir None vals a strings y viceversa?

Respuesta

7

Una posible forma de hacerlo es crear una nueva clase que defina None para este fin, y asignar instancias de esto a la memoria caché (desafortunadamente no se puede ampliar None). Alternativamente, podría usar la cadena vacía "", o evitar almacenar ninguno/valores nulos por completo (la ausencia de la clave implica Ninguno).

A continuación, compruebe si las instancias de la clase 'Ninguna' cuando se registre el resultado de mc.get(key) (is None, == "", etc)

+0

Creo que este es el mejor enfoque. Te da un valor centinela que no se puede confundir por nada más. –

+0

Esto es lo que terminé haciendo. ¡Gracias! – jamtoday

0
No

realmente.

Puede almacenar un valor Ninguno como una cadena vacía, pero realmente no hay una forma de almacenar datos especiales en una Memcache.

¿Cuál es la diferencia entre la clave de caché que no existe y el valor de caché que no es? Probablemente sea mejor unificar estas dos situaciones.

+2

En realidad, puede ser útil para distinguirlos. Por ejemplo, supongamos que tengo una forma (costosa) de autenticar usuarios, y guardo en caché los resultados, los detalles del usuario, en Memcache. Si recibo una respuesta de "no dicho usuario", es probable que desee almacenar en caché esa respuesta negativa, o de lo contrario un usuario puede hacer mi servicio al intentar iniciar sesión con nombres de usuario no válidos una y otra vez. –

+1

Este es exactamente el tipo de situación en la que me encontré. A veces querrá saber que una función devolvió 'Ninguna' pero también que se ha hecho recientemente para que no se ejecute de nuevo. – jamtoday

3

Podría hacer algo como lo que hace Haskell y Scala y almacenar un diccionario de opciones. El diccionario contiene dos claves: una clave para indicar que es válida y una clave que se utiliza para contener los datos. Algo como esto:

{valid: true, data: whatyouwanttostore} 

Entonces, si get retorno Ninguno, usted sabe que la memoria caché se ha perdido; si el resultado es un diccionario con Ninguno como datos, usted sabe que los datos estaban en la caché pero que era falso.

Cuestiones relacionadas