2012-10-13 15 views
10

Aby uzyskać klucz z memcache (używając pylibmc), to zrobić:zdobyć obiekt z Redis bez eval?

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

To samo w REDiS to:

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

Ta ostatnia linia nie wygląda prawo do mnie. redis tylko wydaje się zwracać łańcuchy. Czy otrzymasz polecenie redis, które zwróci obiekt w tej samej formie, w której został wprowadzony?

Odpowiedz

24

Różnica polega na tym, że podczas gdy zarówno memcached i Redis obsługuje tylko wartości ciągów, pylibmc serializes wartości wysłać go za pomocą pickle, redis-py tylko konwertuje je na sznurku.

Jeśli chcesz zrobić to samo z redisem, możesz mieć własne funkcje do wytrawiania za ciebie.

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

lub można nawet podklasa 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) 

Dzięki uprzejmości https://github.com/andymccurdy/redis-py/issues/186