2012-10-13 113 views
10

Para obtener una clave de Memcache (usando pylibmc), esto se hace:Obtiene objeto de redis sin eval?

client.set(key, {'object': 'dictionary'}, time=expire) 
client.get(key) 

Lo mismo en Redis es la siguiente:

redis.setex(key, expire, {'object': 'dictionary'}) 
eval(redis.get(key) or 'None') 

Esa última línea no se ve bien para mí. redis solo parece devolver cadenas. ¿Hay un get redis para devolver el objeto en la misma forma en que fue colocado?

Respuesta

24

La diferencia es que, si bien memcached y redis solo admiten valores de cadena, pylibmc serializa los valores que usted envía usando pickle, redis-py simplemente los convierte en cadena.

Si desea hacer lo mismo con redis, puede tener sus propias funciones para hacer el decapado para usted.

def set_value(redis, key, value): 
    redis.set(key, pickle.dumps(value)) 

def get_value(redis, key): 
    pickled_value = redis.get(key) 
    if pickled_value is None: 
     return None 
    return pickle.loads(pickled_value) 
7

o incluso se puede subclase Redis:

import pickle 
from redis import StrictRedis 


class PickledRedis(StrictRedis): 
    def get(self, name): 
     pickled_value = super(PickledRedis, self).get(name) 
     if pickled_value is None: 
      return None 
     return pickle.loads(pickled_value) 

    def set(self, name, value, ex=None, px=None, nx=False, xx=False): 
     return super(PickledRedis, self).set(name, pickle.dumps(value), ex, px, nx, xx) 

Cortesía: https://github.com/andymccurdy/redis-py/issues/186

Cuestiones relacionadas