Получить объект из redis без eval?
Чтобы получить ключ из memcache (используя pylibmc), вы делаете это:
client.set(key, {'object': 'dictionary'}, time=expire)
client.get(key)
То же самое в redis заключается в следующем:
redis.setex(key, expire, {'object': 'dictionary'})
eval(redis.get(key) or 'None')
Эта последняя строка не подходит мне. redis только кажется, возвращает строки. Есть ли redis для возврата объекта в том же виде, в который он был помещен?
Ответы
Ответ 1
Разница заключается в том, что, хотя memcached и redis поддерживают только строковые значения, pylibmc
сериализует значения, которые вы отправляете с помощью pickle
, redis-py
просто преобразует их в строку.
Если вы хотите сделать то же самое с redis, у вас могут быть свои собственные функции, чтобы сделать травление для вас.
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)
Ответ 2
Или вы можете даже подкласс 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)
Предоставлено: https://github.com/andymccurdy/redis-py/issues/186