Redis সহ একটি অভিধান কীভাবে সংরক্ষণ এবং পুনরুদ্ধার করবেন


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

আমি কীভাবে আমার_ডিকেট সংরক্ষণ করব এবং এটিকে পুনরায় সংগ্রহ করব। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি কাজ করে না।

#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

উত্তর:


160

আপনি এটি দ্বারা করতে পারেন 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'}

48
যদি এটি সরল ডিকের পরিবর্তে নেস্টেড ডেটা কাঠামোযুক্ত থাকে, যেমন কিছু অ্যারে ইত্যাদি থাকে তবে আপনার ডেটাটি json.dumps()স্ট্রিং হিসাবে লেখার সাথে সিরিজ করুন এবং রেডিস ব্যবহারকারীর কাছ json.loads()থেকে পাইথন ডেটা স্ট্রাকচারে আবার ডিজাইরিজাল করার জন্য পুনরুদ্ধার করুন
andilabs

7
json.dumps()এবং json.loads()কেবল তখনই কাজ করবে যদি আপনি আপনার অভিধানের কীগুলি সর্বদা স্ট্রিং হয়ে থাকেন with আপনি যদি না হন তবে আপনি আচার ব্যবহার বিবেচনা করতে পারেন।
রাইচাস

6
জসন বাইটসের সাথে সামঞ্জস্যপূর্ণ নয় তাই জসন সেরিলাইজেশন কোনও বৈশ্বিক সমাধান নয়, উদাহরণস্বরূপ, যদি আপনার বাইটস মান সহ একটি ডিক থাকে তবে এটি কাজ করবে না।
টমি 19

8
নোটের মাধ্যমে, ডকুমেন্টেশন hmsetআপনাকে এটি বলে না তবে আপনি যদি খালি ডিকটি সঞ্চয় করার চেষ্টা করেন তবে এটি একটি ডেটাআরারের উত্থাপন করে।
hlongmore

4
@ প্রদীপ কীভাবে আমরা কীটিকে গতিশীল করতে পারি। ধরুন ডেটা প্রতি 15 মিনিটে
sertedোকানো হচ্ছে

36

আপনি আপনার ডিককে আচার করতে পারেন এবং স্ট্রিং হিসাবে সংরক্ষণ করতে পারেন।

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)

11
এটি সত্য, তবে পড়ার এবং লেখার হারের উপর নির্ভর করে এটি গুরুতর ওভারহেড যুক্ত করতে পারে। পিক্লিং একটি ধীর অপারেশন
টমি

4
দয়া করে মনে রাখবেন যদি এই ব্যবহারকারীর ইনপুট সঙ্গে ব্যবহার করা হয় আপনার সার্ভারে দূরবর্তী কোড exection প্রবণ , pickle.loadsশুধুমাত্র ব্যবহার করা উচিত হয় 100% ডেটা বিশ্বস্ত
Paradoxis

16

অন্য উপায়: আপনি 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

এটি পাইথন প্রকারকে রেডিস ধরণের এবং তদ্বিপরীতকে রূপান্তর করে।

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


4
নোটের মাধ্যমে, রেডিস ওয়ার্কস hmsetহুডের নীচে ব্যবহার করে যদি আপনি কোনও ডিকের জন্য একটি ভেরিয়েবল সেট করে থাকেন, এবং এইভাবে আপনি যদি root.something = {}একটি ডেটাআরার পাবেন hmsetতবে খালি অভিধানের অনুমতি দেয় না। আমি এটি উল্লেখ করেছি কারণ রেডিসের জন্য ডকুমেন্টেশন আপনাকে এটি বলে না।
hlongmore

মজাদার. হ্যাঁ এটি ব্যবহার করে hmset। আমি এটি খতিয়ে দেখব। @hlongmore
সেপম্যান

কিন্তু তবুও, এটি অভিধানে বাইটগুলি সমর্থন করতে পারে?
জেটাক্রিল

12

যেহেতু মৌলিক উত্তরটি ইতিমধ্যে অন্যান্য লোকেরা দিয়েছে, আমি এতে কিছু যুক্ত করতে চাই।

টাইপ মান REDISসহ বেসিক ক্রিয়াকলাপ সম্পাদনের জন্য কমান্ডগুলি নীচে দেওয়া হয়েছেHashMap/Dictionary/Mapping

  1. এইচজিইটি => একক কী পাসের জন্য মান ফেরত দেয়
  2. এইচএসইটি => একক কীটির জন্য সেট / আপডেট মান
  3. এইচএমজিইটি => একক / একাধিক কীগুলির মান ফেরত দেয়
  4. এইচএমএসইটি => একাধিক কী জন্য মান / সেট সেট করে
  5. HGETALL => ম্যাপিংয়ের সমস্ত (কী, মান) জোড়া ফেরত দেয়।

redis-pyগ্রন্থাগারে তাদের সম্পর্কিত পদ্ধতিগুলি নিম্নলিখিত :

  1. HGET => hget
  2. এইচএসইটি => এইচএসটি
  3. এইচএমজিইটি => এইচমেট
  4. এইচএমএসইটি => এইচএমএসেট
  5. 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']

আমি আশা করি, এটি বিষয়গুলিকে আরও স্পষ্ট করে তোলে।


কীভাবে আপনি কীটিকে গতিশীল করতে পারেন
ak3191

11

যদি আপনি অজগর ডিকটি রেডিসে সঞ্চয় করতে চান তবে এটি জসন স্ট্রিং হিসাবে সংরক্ষণ করা ভাল।

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

যে জাতীয় প্রকারের (উদাহরণস্বরূপ: বাইটস) যা জসন ফাংশন দ্বারা সিরিয়ালযুক্ত নয়?

আপনি এমন ধরণের জন্য এনকোডার / ডিকোডার ফাংশন লিখতে পারেন যা জসন ফাংশন দ্বারা সিরিয়ালাইজ করা যায় না। যেমন বাইট অ্যারের জন্য বেস 64 / ascii এনকোডার / ডিকোডার ফাংশন লিখন।


আমি এটিকে নিম্নোক্ত করেছিলাম কারণ কিছু ডিসিকেট জেএসএনে সিরিয়ালায়িত করা যায় না, উদাহরণস্বরূপ, বাইটস মান সহ ডিক্টস।
টমি 19

4
ডিফল্টরূপে এনকোড / ডিকোড করা যায় না এমন প্রকারের জন্য আপনি এনকোডার / ডিকোডার ফাংশন (প্রয়োজনীয়তা অনুসারে, উদাহরণস্বরূপ বেস 64 / এসকিআই এনকোডিং) লিখতে পারেন।
সাজি জাভিয়ার

@ টমি - hmset / hgetall ব্যবহার করা হলেও, আপনাকে পুনরায় দ্বারা সমর্থিত নয় এমন ধরণের এনকোড / ডিকোডের দরকার হতে পারে।
সাজি জাভিয়ার

4
"... পরের অপারেশনটি হ'ল (এন) Dis N আপনার ক্ষেত্রের সংখ্যার সাথে কীটির লিঙ্ক রয়েছে। এন এসইটি / জিইটি বা 1 এইচজিইটি / এইচএসইটি করা একই জটিলতা। দেখুন: redis.io/commands/hmset সময়ানুক্রমিক, এইচজিইটি / এইচএসইটি হ'ল পারমাণবিক লেনদেন, এবং তাই রেডিস দ্বারা দ্রুত সম্পাদিত হয়। আপনি কেবল রেডিস থেকে পাইথন কোডে জটিলতাটি সরাচ্ছেন।
জেটাক্রিল

এইচএমএসেটের সুবিধা হ'ল ডিকের কেবলমাত্র কয়েকটি উপ-অংশ পুনরুদ্ধার করার সম্ভাবনা। জসন দিয়ে আমরা এটি হারাতে পারি, সুতরাং এটি আচার বা অন্য জিনিস হিসাবে ভাল।
জর্জি লিটাইও

5

একটি ব্যবহার বিবেচনা করতে পারেন MessagePack যা 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]}

পাইপথ পাইথন এবং অায়োরডিস ব্যবহার করে


4

আপনি এই পদ্ধতির কাছে যেতে পারেন এমন অন্য একটি উপায়:

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!

দক্ষতা / গতির জন্য আমি এটি পরীক্ষা করিনি।


3

Redis SET কমান্ড একটি স্ট্রিং সঞ্চয় করে, স্বেচ্ছাসেবী ডেটা নয়। আপনি ডাইসকে রেডিস হ্যাশ হিসাবে সংরক্ষণ করার জন্য রেডিস এইচএসইটি কমান্ডটি ব্যবহার করার চেষ্টা করতে পারেন এর মতো কিছু

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

তবে রেডিস ডেটাটাইপস এবং পাইথন ডেটাটাইপগুলি বেশ লাইন দেয় না। পাইথন ডিক্সগুলি নির্বিচারে বাসা বেঁধে দেওয়া যেতে পারে তবে একটি রেডিস হ্যাশ আপনার মানটির একটি স্ট্রিং প্রয়োজন require আপনি গ্রহণ করতে পারেন এমন অন্য পদ্ধতি হ'ল আপনার অজগর ডেটাটিকে স্ট্রিংয়ে রূপান্তর করা এবং এটি রেডিসে সংরক্ষণ করা, এর মতো কিছু

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

এবং তারপরে স্ট্রিংটি বের হয়ে গেলে পাইথন অবজেক্টটি পুনরায় তৈরি করার জন্য আপনাকে এটি বিশ্লেষণ করতে হবে।


4
তিনি তার ডেটাটি জসনে রূপান্তর করতে এবং ফলাফলটি পুনরায় সংরক্ষণ করতে পারেন
নারকিস দৌদিউ সিয়েউ

3

এইচএমএসইটি হ্রাস করা হয়েছে। আপনি এখন অভিধান হিসাবে এইচএসইটি ব্যবহার করতে পারেন:

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)

ধন্যবাদ! আমি ডকটি খুঁজতে চেষ্টা করছি যেখানে এই সমস্ত বানান রয়েছে sp তুমি কোথায় জানো এটা কোথায়? উদাহরণস্বরূপ, দুটি "নন" কীসের জন্য।
নিলওয়াল্টার্স

@ নিলওয়াল্টার্স: অবচয় হুঁশিয়ারির জন্য এইচএমএসইটি কমান্ড পৃষ্ঠায় লাইনটি দেখুন - redis.io/commands/hmset
শরণশ সিং

0

ব্যবহার করে দেখুন 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

আপনি যদি রেডিসে ডেটা কীভাবে সংগঠিত করবেন ঠিক না জানেন, তবে ফলাফল পার্সিং সহ আমি কিছু কার্য সম্পাদন পরীক্ষা করেছি। আমি যে স্বৈরশাসনটি ব্যবহার করেছি ( ডি ) তাতে 437.084 কী (এমডি 5 ফর্ম্যাট) ছিল এবং এই ফর্মটির মানগুলি:

{"path": "G:\tests\2687.3575.json",
 "info": {"f": "foo", "b": "bar"},
 "score": 2.5}

প্রথম পরীক্ষা (একটি পুনরায় কী-মান ম্যাপিংয়ে ডেটা tingোকানো):

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

দ্বিতীয় পরীক্ষা (সরাসরি রেডিস কীগুলিতে ডেটা tingোকানো):

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

আপনি দেখতে পাচ্ছেন, দ্বিতীয় পরীক্ষায় কেবল 'তথ্য' মানগুলি বিশ্লেষণ করতে হবে, কারণ হ্যাজটাল (কী) ইতিমধ্যে একটি ডিক্ট ফিরিয়েছে, তবে কোনও নেস্টেড নয়।

এবং অবশ্যই, রেডিসকে অজগরটির ডিক্টস হিসাবে ব্যবহার করার সর্বোত্তম উদাহরণ হ'ল প্রথম টেস্ট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.