2012-10-13 6 views
10

Um einen Schlüssel aus memcache (mit pylibmc) zu erhalten, tun Sie dies:Objekt von redis ohne eval bekommen?

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

Das gleiche in redis dies:

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

Das letzte Zeile nicht richtig zu mir sieht. redis scheint nur Strings zurückzugeben. Gibt es ein get redis, um das Objekt in der gleichen Form zurückzugeben, in der es eingefügt wurde?

Antwort

24

Der Unterschied ist, dass, während Memcached und Redis nur Zeichenfolgenwerte unterstützen, die Werte, die Sie senden, pylibmc mit pickle serialisiert, redis-py konvertiert sie nur in Zeichenfolge.

Wenn Sie dasselbe mit redis tun möchten, können Sie Ihre eigenen Funktionen haben, um das Beizen für Sie zu tun.

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

oder Sie können sogar Unterklasse 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) 

Courtesy: https://github.com/andymccurdy/redis-py/issues/186