如何存储和提取字典 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
已邀请:

三叔

赞同来自:

你可以用它
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'}

郭文康

赞同来自:

您可以选择您的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/

窦买办

赞同来自:

另一种方式:您可以使用库
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 B型。 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
</class>

董宝中

赞同来自:

如果你想保存 python 盘B. 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/


在删除de序列化时 json.loads


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


我更喜欢 SET / GET 超过 HMSET/HGETALL, 因为最后一次操作的时间复杂性是相等的 O /N/.

关于类型的类型 /eg.bytes/, 这不是通过函数序列化的 json ?

您可以编写编码器功能/用于使用功能序列化的类型的解码器 json. 例如。记录编码器的功能/解码器 base64/ascii 字节数组。

八刀丁二

赞同来自:

由于其他人已经给出了主要答案,我想添加一些。

以下是命令
REDIS

使用类型值执行基本操作
HashMap/Dictionary/Mapping

.

HGET => 返回一个传输密钥的值

HSET => 放 / 更新一个键的值

HMGET => 返回一个或多个传输键的值。

HMSET => 放 / 更新多个键的值

HGETALL = > 返回所有夫妻 /核心价值/在映射中。

以下是他们在图书馆中的各自方法。
redis-py

:-

HGET => hget

HSET => hset

HMGET => hmget

HMSET => hmset

HGETALL => hgetall

所有上述方法 setter 如果它不存在,请创建显示。
所有上述方法 getter 不要引起 error/exceptions,, 如果一个 mapping / key in mapping 不存在。


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


我希望这一切都澄清。

喜特乐

赞同来自:

您可以以不同的方式接近这个问题:


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!


我没有检查一下 efficiency/speed.

八刀丁二

赞同来自:

团队 redis SET 存储字符串,而不是任意数据。 您可以尝试使用该命令。 redis HSET 用于存储 dict 作为 redis hash 有类似的东西


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


但数据类型 redis 和 python 不要一致。 Python 听写可以任意嵌入,但是 redis hash 它需要您的值是一个字符串。 您可以使用的另一种方法 - 这会转换您的数据 python 在字符串中并保存在 redis, 有点


r.set/'this_dict', str/my_dict//


然后当您获得一个字符串时,您需要拆卸它以重新创建对象 python.

莫问

赞同来自:

有可能考虑使用 MessagePack
https://msgpack.org/index.html
批准是批准的 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]}


使用
https://github.com/msgpack/msgpack-python

https://github.com/aio-libs/aioredis

冰洋

赞同来自:

HMSET 过时了。 现在你可以使用 HSET 用字典如下:


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/

喜特乐

赞同来自:

尝试
https://github.com/RedisLabs/rejson-py
, 哪个相对较新 2017 一年。 看这个
https://redislabs.com/blog/redis-as-a-json-store/
.


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/

石油百科

赞同来自:

如果您不确定如何组织数据 Redis, 我花了几种性能测试,包括对结果的分析。
在我用的词典中 /

D.

/ 有钥匙 437.084 /格式 MD5/, 以及此表格的值:


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


第一次测试

/将数据插入键值比较 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


第二次测试

/直接以键插入数据 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


如您所见,只有在第二个测试中应分析值。 'info', 因为 hgetall/钥匙/ 已经返回了 dict, 但没有投资。

当然,使用的最佳例子 Redis 听说python是

第一次测试

要回复问题请先登录注册