我尝试使用flask microframework,并希望在redis中缓存一些统计数据。假设我有这样一句话:
mydict = {}
mydict["test"] = "test11"我把它保存到了redis
redis.hmset("test:key", mydict)但是,在恢复之后
stored = redis.hgetall("test:key")
print(str(stored))我看到了奇怪的{b'test': b'test11'},所以stored.get("test")什么也没给我
{'test': 'test11'},mydict字符串方法结果看起来很好。那么,为什么将这个二进制标记添加到恢复的数据中呢?我还检查了redis-cli,没有看到显式的b标记。hgetall有什么问题吗?
发布于 2014-09-21 18:05:19
这是预期的行为。默认情况下,来自Redis的字符串不会被解码。您有几个选项:
decode_responses参数对客户端实例的数据进行解码,例如StrictRedis(decode_responses=True)。这将根据charset参数(默认为utf-8)解码来自Redis的所有字符串。只有这样做,您才能确保来自Redis的每个响应都包含您希望解码为utf-8的字符串数据。如果您使用相同的客户端实例来获取二进制数据,例如一个pickled对象,则不应该使用此选项。在这种情况下,我建议对二进制数据使用单独的客户端实例。来源:https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918
发布于 2017-02-22 13:27:24
POOL = redis.ConnectionPool(host='localhost', **decode_responses=True**, port=6379, db=0)
datastore = redis.StrictRedis(connection_pool=POOL)如果使用ConnectionPool,则应将decode_responses=True移至ConnectionPool的构造函数。
发布于 2019-11-14 19:40:27
下面是一个简单的例程,用于对HGETALL返回的redis dict执行字节解码
def decode_redis(src):
if isinstance(src, list):
rv = list()
for key in src:
rv.append(decode_redis(key))
return rv
elif isinstance(src, dict):
rv = dict()
for key in src:
rv[key.decode()] = decode_redis(src[key])
return rv
elif isinstance(src, bytes):
return src.decode()
else:
raise Exception("type not handled: " +type(src))..。要使用它,只需传递给redis字典...
obj = decode_redis(redis_connection.hgetall(key))https://stackoverflow.com/questions/23256932
复制相似问题