2012-10-13 14 views
10

Per ottenere una chiave da memcache (utilizzando pylibmc), si esegue questa operazione:ottiene l'oggetto da redis senza eval?

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

Lo stesso in Redis è questo:

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

Quella ultima linea non sembra giusto per me. redis sembra solo restituire stringhe. C'è un get redis per restituire l'oggetto nella stessa forma in cui è stato inserito?

risposta

24

La differenza è che mentre sia memcached che redis supportano solo i valori stringa, pylibmc serializza i valori che vengono inviati utilizzando pickle, redis-py li converte semplicemente in stringa.

Se si vuole fare lo stesso con redis, è possibile avere le proprie funzioni per fare il decapaggio per voi.

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 si può anche sottoclasse 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) 

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

Problemi correlati