Как хранить и извлекать словарь с помощью 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
Ответы
Ответ 1
Вы можете сделать это с помощью 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'}
Ответ 2
вы можете рассортировать свой dict и сохранять как строку.
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)
Ответ 3
Другой способ: вы можете использовать библиотеку 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
Ответ 4
Поскольку основной ответ уже дали другие люди, я хотел бы добавить к нему некоторые.
Ниже приведены команды в REDIS
для выполнения основных операций со значениями типа HashMap/Dictionary/Mapping
.
- HGET => Возвращает значение для одного переданного ключа
- HSET => установить/обновить значение для одного ключа
- HMGET => Возвращает значение для одного/нескольких переданных ключей
- HMSET => установить/обновить значения для нескольких ключей
- HGETALL => Возвращает все пары (ключ, значение) в отображении.
Ниже приведены их соответствующие методы в библиотеке redis-py
:
- HGET => Hget
- HSET => hset
- HMGET => hmget
- HMSET => hmset
- 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']
Надеюсь, это проясняет ситуацию.
Ответ 5
Если вы хотите сохранить 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 для байтового массива.
Ответ 6
Команда redis SET хранит строку, а не произвольные данные. Вы можете попробовать использовать команду redis HSET для хранения dict в качестве хэша redis с чем-то вроде
for k,v in my_dict.iteritems():
r.hset('my_dict', k, v)
но типы данных redis и типы данных python не совсем совпадают. Python dicts может быть произвольно вложенным, но хеш redis будет требовать, чтобы ваше значение было строкой. Другой подход, который вы можете предпринять, - преобразовать ваши данные python в строку и сохранить это в redis, что-то вроде
r.set('this_dict', str(my_dict))
а затем, когда вы получите строку, вам нужно будет ее проанализировать, чтобы воссоздать объект python.
Ответ 7
Попробуйте 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)