从没有eval的redis获取对象?

pri*_*stc 11 python redis

要从memcache(使用pylibmc)获取密钥,请执行以下操作:

client.set(key, {'object': 'dictionary'}, time=expire)
client.get(key)
Run Code Online (Sandbox Code Playgroud)

redis中的相同内容如下:

redis.setex(key, expire, {'object': 'dictionary'})
eval(redis.get(key) or 'None')
Run Code Online (Sandbox Code Playgroud)

最后一行对我来说不合适.redis似乎只返回字符串.是否有一个get redis以与放入它相同的形式返回对象?

Luk*_*ský 27

不同之处在于,虽然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)
Run Code Online (Sandbox Code Playgroud)


Son*_*van 9

或者您甚至可以将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)
Run Code Online (Sandbox Code Playgroud)

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