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
파이썬 유형을 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
이미 다른 분들이 기본적인 답변을 해주셨 기 때문에 추가하고 싶습니다.
다음은 유형 값으로 REDIS
기본 작업을 수행 하는 명령입니다 HashMap/Dictionary/Mapping
.
- HGET => 전달 된 단일 키 값을 반환합니다.
- HSET => 단일 키 값 설정 / 업데이트
- HMGET => 전달 된 단일 / 다중 키 값을 반환합니다.
- HMSET => 다중 키 값 설정 / 업데이트
- HGETALL => 매핑의 모든 (키, 값) 쌍을 반환합니다.
다음은 redis-py
라이브러리 의 각 방법입니다 .
- HGET => hget
- HSET => hset
- HMGET => hmget
- HMSET => hmset
- HGETALL => hgetall
위의 모든 setter 메서드는 존재하지 않는 경우 매핑을 만듭니다. 위의 모든 getter 메서드는 매핑에 매핑 / 키가 존재하지 않는 경우 오류 / 예외를 발생시키지 않습니다.
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']
나는 그것이 일을 더 명확하게 해주기를 바랍니다.
redis에 파이썬 dict를 저장하려면 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 함수에 의해 직렬화되지 않는 유형 (예 : 바이트)은 어떻습니까?
You can write encoder/decoder functions for types that cannot be serialized by json functions. eg. writing base64/ascii encoder/decoder function for byte array.
The redis SET command stores a string, not arbitrary data. You could try using the redis HSET command to store the dict as a redis hash with something like
for k,v in my_dict.iteritems():
r.hset('my_dict', k, v)
but the redis datatypes and python datatypes don't quite line up. Python dicts can be arbitrarily nested, but a redis hash is going to require that your value is a string. Another approach you can take is to convert your python data to string and store that in redis, something like
r.set('this_dict', str(my_dict))
and then when you get the string out you will need to parse it to recreate the python object.
Try rejson-py which is relatively new since 2017. Look at this introduction.
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)
참고URL : https://stackoverflow.com/questions/32276493/how-to-store-and-retrieve-a-dictionary-with-redis
'Programing' 카테고리의 다른 글
IOS7의 상태 표시 줄 및 탐색 표시 줄 문제 (0) | 2020.12.14 |
---|---|
phpstorm은 array () 표기법을 [] 짧은 구문으로 바꿉니다. (0) | 2020.12.14 |
Bugzilla 또는 Mantis? (0) | 2020.12.14 |
클라이언트 측에서 텍스트가 모두 공백 문자인지 확인하는 방법은 무엇입니까? (0) | 2020.12.14 |
웹 브라우저 컨트롤에 문자열 html 내용을 표시하는 방법은 무엇입니까? (0) | 2020.12.14 |