80

hmset 関数は各フィールドの値を設定できますが、値自体が複雑な構造のオブジェクトである場合、hget から返される値は元のオブジェクトではなく、シリアル化された文字列であることがわかりました。

例えば

images= [{'type':'big', 'url':'....'},
     {'type':'big', 'url':'....'},
     {'type':'big', 'url':'....'}]   

redis = Redis()
redis.hset('photo:1', 'images', images)

i = redis.hget('photo:1', 'images')
print type(i)

i の型は文字列であり、Python オブジェクトではありません。各フィールドを手動で解析する以外に、この問題を解決する方法はありますか?

4

10 に答える 10

129

実際、組み込みモジュールpickleを使用して Python オブジェクトを redis に保存できます。

これが例です。

import pickle
import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)
obj = ExampleObject()
pickled_object = pickle.dumps(obj)
r.set('some_key', pickled_object)
unpacked_object = pickle.loads(r.get('some_key'))
obj == unpacked_object
于 2013-12-05T12:39:05.483 に答える
56

Redis でネストされた構造を作成することはできません。つまり、(たとえば) ネイティブ redis ハッシュ マップ内にネイティブ redis リストを格納することはできません。

ネストされた構造が本当に必要な場合は、代わりに JSON-blob (または類似のもの) を保存することをお勧めします。もう 1 つのオプションは、「id」/キーをマップ キーの値として別の redis オブジェクトに保存することですが、完全なオブジェクトを取得するには、サーバーを複数回呼び出す必要があります。

于 2013-03-05T09:20:37.803 に答える
7

私は、より複雑な構造/階層を redis で作成できるようにするライブラリSubRedisを作成しました。redis インスタンスとプレフィックスを指定すると、ほぼ完全に機能する独立した redis インスタンスが提供されます。

redis = Redis()
photoRedis = SubRedis("photo:%s" % photoId, redis)
photoRedis.hmset('image0', images[0])
photoRedis.hmset('image1', images[1])
...

SubRedis は、渡された文字列をプレフィックスとしてフラットな redis データ構造の先頭に追加するだけです。これは、redisで多くのことを行うことになるパターンの便利なラッパーであることがわかりました-いくつかのデータをネストするためにいくつかのIDを先頭に追加します。

于 2014-02-01T02:58:45.670 に答える
4

ライブラリを使用できますRedisWorks

pip install redisworks

>>> from redisworks import Root
>>> root = Root()
>>> root.something = {1:"a", "b": {2: 2}}  # saves it as Hash
>>> print(root.something)  # loads it from Redis
{'b': {2: 2}, 1: 'a'}
>>> root.something['b'][2]
2

Python の型を Redis の型に、またはその逆に変換します。

>>> root.sides = [10, [1, 2]]  # saves it as list in Redis.
>>> print(root.sides)  # loads it from Redis
[10, [1, 2]]
>>> type(root.sides[1])
<class 'list'>

免責事項:私はライブラリを書きました。コードは次のとおりです: https://github.com/seperman/redisworks

于 2016-08-30T05:47:31.137 に答える
-3

構造をそのまま保存し、「評価」を実行して文字列からオブジェクトに変換できます。

images= [{'type':'big', 'url':'....'},
 {'type':'big', 'url':'....'},
 {'type':'big', 'url':'....'}]   
redis = Redis()
redis.hset('photo:1', 'images', images)

i = eval(redis.hget('photo:1', 'images'))
print type(i) #type of i should be list instead of string now
于 2013-03-21T21:43:49.267 に答える