在redis中保存unicode但是获取错误

goo*_*nsu 5 python redis

我正在使用mongodb和redis,redis是我的缓存.

我用redis-py缓存mongodb对象:

obj in mongodb: {u'name': u'match', u'section_title': u'\u6d3b\u52a8', u'title': 
u'\u6bd4\u8d5b', u'section_id': 1, u'_id': ObjectId('4fb1ed859b10ed2041000001'), u'id': 1}
Run Code Online (Sandbox Code Playgroud)

使用hgetall(key,obj)从redis获取的obj是:

{'name': 'match', 'title': '\xe6\xaf\x94\xe8\xb5\x9b', 'section_title': 
'\xe6\xb4\xbb\xe5\x8a\xa8', 'section_id': '1', '_id': '4fb1ed859b10ed2041000001', 'id': '1'}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,从缓存获取的obj是str而不是unicode,所以在我的应用程序中,有一个错误:'ascii'编解码器无法解码位置12中的字节0xe6:序数不在范围内(128)

谁能提出一些建议?感谢你

jmo*_*moz 27

我想我已经发现了这个问题.读完之后,我不得不从redis中明确解码,这是一种痛苦,但有效.

我偶然发现了一篇博客文章,其中作者的输出是所有unicode字符串,这与我的不同.

查看默认情况下StrictRedis.__init__有一个参数.https://github.com/andymccurdy/redis-py/blob/273a47e299a499ed0053b8b90966dc2124504983/redis/client.py#L446decode_responsesFalse

传递decode_responses=True的结构,对我这个修复的任择议定书的问题.


okm*_*okm 7

更新,全局设置,检查jmoz的答案.

如果您使用的是第三方库django-redis,则可能需要指定自定义ConnectionFactory:

class DecodeConnectionFactory(redis_cache.pool.ConnectionFactory):
    def get_connection(self, params):
        params['decode_responses'] = True
        return super(DecodeConnectionFactory, self).get_connection(self, params)
Run Code Online (Sandbox Code Playgroud)

你使用Redis的-PY假设,你最好通过str的,而不是unicode对Redis的,否则的Redis会自动对其进行编码*set指令,通常在UTF-8 .对于*get命令,Redis不知道值的正式类型,只需str直接返回值.

因此,正如Denis所说,将对象存储到Redis的方式至关重要.您需要将值转换str为使Redis图层透明.

另外,将默认编码设置为UTF-8而不是使用ascii


Tha*_*sas 6

对于每个字符串,您可以使用该decode函数在utf-8中对其进行转换,例如,对于代码中的标题字段的值:

In [7]: a='\xe6\xaf\x94\xe8\xb5\x9b'

In [8]: a.decode('utf8')
Out[8]: u'\u6bd4\u8d5b'
Run Code Online (Sandbox Code Playgroud)


mar*_*bdq 5

我建议您在写入 MongoDB 或 Redis(或任何外部系统)之前始终编码为 utf-8。并且当你得到结果时你 decode('utf-8') ,所以你总是在 Python 中使用 Unicode。