# I have the dictionary my_dict
my_dict = {
'var1' : 5
'var2' : 9
}
r = redis.StrictRedis()
Bagaimana cara menyimpan my_dict dan mengambilnya dengan redis. Misalnya, kode berikut tidak berfungsi.
#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
json.dumps()
menulis sebagai string dan setelah mengambil dari pengguna redisjson.loads()
untuk deserialisasi kembali ke struktur data pythonjson.dumps()
danjson.loads()
hanya akan berfungsi jika Anda baik-baik saja dengan kunci kamus Anda yang selalu berupa string. Jika tidak, Anda mungkin mempertimbangkan untuk menggunakan acar.hmset
tidak memberi tahu Anda ini, tetapi memunculkan DataError jika Anda mencoba untuk menyimpan dikt yang kosong.Anda dapat membuat acar dict Anda dan menyimpannya sebagai string.
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)
sumber
pickle.loads
seharusnya hanya digunakan pada 100% data tepercayaCara lain: Anda bisa menggunakan
RedisWorks
perpustakaan.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
Ini mengubah jenis python menjadi jenis Redis dan sebaliknya.
>>> 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'>
Penafian: Saya menulis perpustakaan. Ini kodenya: https://github.com/seperman/redisworks
sumber
hmset
bawah tenda jika Anda menyetel variabel ke dikt, dan dengan demikian jika Anda melakukannya,root.something = {}
Anda akan mendapatkan DataError, karenahmset
tidak mengizinkan kamus kosong. Saya menyebutkan ini karena dokumentasi untuk redis tidak memberi tahu Anda hal ini.hmset
. Saya akan memeriksa ini. @hlongmoreKarena jawaban dasar telah diberikan oleh orang lain, saya ingin menambahkan beberapa.
Berikut adalah perintah
REDIS
untuk melakukan operasi dasar denganHashMap/Dictionary/Mapping
nilai tipe.Berikut adalah metode masing-masing di
redis-py
perpustakaan: -Semua metode penyetel di atas membuat pemetaan, jika tidak ada. Semua metode pengambil di atas tidak memunculkan kesalahan / pengecualian, jika pemetaan / kunci dalam pemetaan tidak ada.
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']
Saya harap, ini membuat semuanya lebih jelas.
sumber
Jika Anda ingin menyimpan dikt python di redis, lebih baik menyimpannya sebagai string 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)
Saat mengambil de-serialisasi menggunakan json.loads
data = r.get('key1') result = json.loads(data) arr = result['var3']
Bagaimana dengan tipe (mis. Byte) yang tidak diserialkan oleh fungsi json?
Anda dapat menulis fungsi encoder / decoder untuk jenis yang tidak dapat diserialkan oleh fungsi json. misalnya. menulis fungsi encoder / decoder base64 / ascii untuk array byte.
sumber
Seseorang mungkin mempertimbangkan untuk menggunakan MessagePack yang didukung oleh redis.
import msgpack data = { 'one': 'one', 'two': 2, 'three': [1, 2, 3] } await redis.set('my-key', msgpack.packb(data)) val = await redis.get('my-key') print(msgpack.unpackb(val)) # {'one': 'one', 'two': 2, 'three': [1, 2, 3]}
Menggunakan msgpack-python dan aioredis
sumber
Cara lain untuk mendekati masalah ini:
import redis conn = redis.Redis('localhost') v={'class':'user','grants': 0, 'nome': 'Roberto', 'cognome': 'Brunialti'} y=str(v) print(y['nome']) #<=== this return an error as y is actually a string conn.set('test',y) z=eval(conn.get('test')) print(z['nome']) #<=== this really works!
Saya tidak mengujinya untuk efisiensi / kecepatan.
sumber
Perintah redis SET menyimpan string, bukan data arbitrer. Anda dapat mencoba menggunakan perintah redis HSET untuk menyimpan dict sebagai hash redis dengan sesuatu seperti
for k,v in my_dict.iteritems(): r.hset('my_dict', k, v)
tetapi tipe data redis dan tipe data python tidak cukup berbaris. Dicts Python dapat disarangkan secara sewenang-wenang, tetapi hash redis akan mengharuskan nilai Anda adalah string. Pendekatan lain yang dapat Anda ambil adalah mengonversi data python Anda menjadi string dan menyimpannya di redis, seperti
r.set('this_dict', str(my_dict))
dan kemudian saat Anda mengeluarkan string, Anda perlu menguraikannya untuk membuat ulang objek python.
sumber
HMSET tidak digunakan lagi. Anda sekarang dapat menggunakan HSET dengan kamus sebagai berikut:
import redis r = redis.Redis('localhost') key = "hashexample" queue_entry = { "version":"1.2.3", "tag":"main", "status":"CREATED", "timeout":"30" } r.hset(key,None,None,queue_entry)
sumber
Coba rejson-py yang relatif baru sejak 2017. Lihat pengantar ini .
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)
sumber
Jika Anda tidak tahu persis bagaimana mengatur data di Redis, saya melakukan beberapa tes kinerja, termasuk hasil parsing. Dictonary yang saya gunakan ( d ) memiliki 437.084 kunci (format md5), dan nilai dari formulir ini:
{"path": "G:\tests\2687.3575.json", "info": {"f": "foo", "b": "bar"}, "score": 2.5}
Tes Pertama (memasukkan data ke dalam pemetaan nilai kunci redis):
conn.hmset('my_dict', d) # 437.084 keys added in 8.98s conn.info()['used_memory_human'] # 166.94 Mb for key in d: json.loads(conn.hget('my_dict', key).decode('utf-8').replace("'", '"')) # 41.1 s import ast for key in d: ast.literal_eval(conn.hget('my_dict', key).decode('utf-8')) # 1min 3s conn.delete('my_dict') # 526 ms
Tes Kedua (memasukkan data langsung ke kunci Redis):
for key in d: conn.hmset(key, d[key]) # 437.084 keys added in 1min 20s conn.info()['used_memory_human'] # 326.22 Mb for key in d: json.loads(conn.hgetall(key)[b'info'].decode('utf-8').replace("'", '"')) # 1min 11s for key in d: conn.delete(key) # 37.3s
Seperti yang Anda lihat, pada pengujian kedua, hanya nilai 'info' yang harus diurai, karena hgetall (key) sudah mengembalikan dict, tetapi bukan yang bertingkat.
Dan tentu saja, contoh terbaik menggunakan Redis sebagai penis python, adalah Tes Pertama
sumber