6

私は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}

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'}

ご覧のとおり、キャッシュからフェッチされたobjはユニコードではなくstrであるため、私のアプリでは、次のようなエラーが発生します。

誰かがいくつかの提案をすることができますか?ありがとう

4

4 に答える 4

28

私は問題を発見したと思います。これを読んだ後、私はredisから明示的にデコードする必要がありました。これは苦痛ですが、機能します。

著者の出力がすべて私のものとは明らかに異なるUnicode文字列であるブログ投稿に出くわしました。

そこを調べると、デフォルトででStrictRedis.__init__あるパラメータがあります。https://github.com/andymccurdy/redis-py/blob/273a47e299a499ed0053b8b90966dc2124504983/redis/client.py#L446decode_responsesFalse

decode_responses=Trueコンストラクトを渡すと、私にとってこれはOPの問題を修正します。

于 2012-09-05T16:18:37.700 に答える
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)

redis-pyを使用していると仮定すると、Redisに渡すstr代わりに渡す方がよいでしょう。そうしないと、Redisはコマンド用に自動的にエンコードします(通常はUTF-8)。コマンドの場合、Redisは値の正式なタイプを認識しておらず、値を直接返す必要があります。unicode*set*getstr

したがって、Denisが言ったように、オブジェクトをRedisに保存する方法は重要です。値をに変換しstrて、Redisレイヤーを透過的にする必要があります。

また、デフォルトのエンコーディングを使用する代わりにUTF-8に設定しますascii

于 2012-05-15T13:27:54.170 に答える
6

文字列ごとに、decode関数を使用してutf-8に変換できます。たとえば、コードのタイトルフィールドの場合の値は次のとおりです。

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

In [8]: a.decode('utf8')
Out[8]: u'\u6bd4\u8d5b'
于 2012-05-15T10:54:00.330 に答える
5

MongoDBまたはRedis(または任意の外部システム)に書き込む前に、常にutf-8にエンコードすることをお勧めします。また、結果に影響を与えるときにデコード('utf-8')することで、Pythonで常にUnicodeを使用できるようになります。

于 2012-05-15T12:09:44.473 に答える