web-dev-qa-db-ja.com

redisで辞書を保存および取得する方法

# I have the dictionary my_dict
my_dict = {
    'var1' : 5
    'var2' : 9
}
r = redis.StrictRedis()

My_dictを保存し、redisで取得するにはどうすればよいですか。たとえば、次のコードは機能しません。

#Code that doesn't work
r.set('this_dict', my_dict)  # to store my_dict in this_dict
r.get('this_dict')  # to retrieve my_dict
56
PiccolMan

hmsetで実行できます(hmsetを使用して複数のキーを設定できます)。

hmset("RedisKey", dictionaryToSet)

import redis
conn = redis.Redis('localhost')

user = {"Name":"Pradeep", "Company":"SCTL", "Address":"Mumbai", "Location":"RCP"}

conn.hmset("pythonDict", user)

conn.hgetall("pythonDict")

{'Company': 'SCTL', 'Address': 'Mumbai', 'Location': 'RCP', 'Name': 'Pradeep'}
106
PradeepK

辞書をピクルスにして文字列として保存できます。

import pickle
import redis

r = redis.StrictRedis('localhost')
mydict = {1:2,2:3,3:4}
p_mydict = pickle.dumps(mydict)
r.set('mydict',p_mydict)

read_dict = r.get('mydict')
yourdict = pickle.loads(read_dict)
27
DaveQ

別の方法:RedisWorksライブラリを使用できます。

pip install redisworks

>>> from redisworks import Root
>>> root = Root()
>>> root.something = {1:"a", "b": {2: 2}}  # saves it as Hash type in Redis
...
>>> 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

13
Seperman

基本的な答えは他の人からすでに与えられているので、私はそれにいくつかを追加したいと思います。

以下は、HashMap/Dictionary/Mapping型の値で基本操作を実行するREDISのコマンドです。

  1. HGET =>渡された単一キーの値を返します
  2. HSET =>単一キーの値を設定/更新
  3. HMGET =>渡された単一/複数キーの値を返します
  4. HMSET =>複数キーの値を設定/更新
  5. HGETALL =>マッピング内のすべての(キー、値)ペアを返します。

redis-pyライブラリのそれぞれのメソッドは次のとおりです。

  1. HGET => hget
  2. HSET => hset
  3. HMGET => hmget
  4. HMSET => hmset
  5. HGETALL => hgetall

上記のすべてのセッターメソッドは、マッピングが存在しない場合は作成します。マッピング/マッピングのキーが存在しない場合、上記のゲッターメソッドはすべてエラー/例外を発生しません。

Example:
=======
In [98]: import redis
In [99]: conn = redis.Redis('localhost')

In [100]: user = {"Name":"Pradeep", "Company":"SCTL", "Address":"Mumbai", "Location":"RCP"}

In [101]: con.hmset("pythonDict", {"Location": "Ahmedabad"})
Out[101]: True

In [102]: con.hgetall("pythonDict")
Out[102]:
{b'Address': b'Mumbai',
 b'Company': b'SCTL',
 b'Last Name': b'Rajpurohit',
 b'Location': b'Ahmedabad',
 b'Name': b'Mangu Singh'}

In [103]: con.hmset("pythonDict", {"Location": "Ahmedabad", "Company": ["A/C Pri
     ...: sm", "ECW", "Musikaar"]})
Out[103]: True

In [104]: con.hgetall("pythonDict")
Out[104]:
{b'Address': b'Mumbai',
 b'Company': b"['A/C Prism', 'ECW', 'Musikaar']",
 b'Last Name': b'Rajpurohit',
 b'Location': b'Ahmedabad',
 b'Name': b'Mangu Singh'}

In [105]: con.hget("pythonDict", "Name")
Out[105]: b'Mangu Singh'

In [106]: con.hmget("pythonDict", "Name", "Location")
Out[106]: [b'Mangu Singh', b'Ahmedabad']

物事がより明確になることを願っています。

python dictをredisに保存する場合は、json文字列として保存することをお勧めします。

import redis

r = redis.StrictRedis(Host='localhost', port=6379, db=0)
mydict = { 'var1' : 5, 'var2' : 9, 'var3': [1, 5, 9] }
rval = json.dumps(mydict)
r.set('key1', rval)

Json.loadsを使用して逆シリアル化を取得しながら

data = r.get('key1')
result = json.loads(data)
arr = result['var3']

json関数によってシリアル化されていない型(バイトなど)はどうですか?

JSON関数でシリアル化できないタイプのエンコーダー/デコーダー関数を作成できます。例えば。バイト配列用のbase64/asciiエンコーダー/デコーダー関数の作成。

4
Saji Xavier

Redis SETコマンドは、任意のデータではなく文字列を保存します。 redis HSETコマンドを使用して、dictを次のようなredisハッシュとして保存してみてください。

for k,v in my_dict.iteritems():
    r.hset('my_dict', k, v)

しかし、redisデータ型とpythonデータ型は完全に揃っていません。 Python dictは任意にネストできますが、redisハッシュでは値が文字列である必要があります。あなたが取ることができる別のアプローチは、あなたのpythonデータを文字列に変換し、それをredisに保存することです。

r.set('this_dict', str(my_dict))

文字列を取得したら、解析してpythonオブジェクトを再作成する必要があります。

2
Jesusaur

rejson-py を試してください。これは2017年以降比較的新しいものです。これを見てください 紹介

from rejson import Client, Path

rj = Client(Host='localhost', port=6379)

# Set the key `obj` to some object
obj = {
    'answer': 42,
    'arr': [None, True, 3.14],
    'truth': {
        'coord': 'out there'
    }
}
rj.jsonset('obj', Path.rootPath(), obj)

# Get something
print 'Is there anybody... {}?'.format(
    rj.jsonget('obj', Path('.truth.coord'))
)

# Delete something (or perhaps nothing), append something and pop it
rj.jsondel('obj', Path('.arr[0]'))
rj.jsonarrappend('obj', Path('.arr'), 'something')
print '{} popped!'.format(rj.jsonarrpop('obj', Path('.arr')))

# Update something else
rj.jsonset('obj', Path('.answer'), 2.17)
0
Kevin Zhu