복붙노트

[REDIS] 어떻게 저장하고 레디 스와 사전을 검색 할

REDIS

어떻게 저장하고 레디 스와 사전을 검색 할

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

어떻게 my_dict를 저장하고 레디 스로를 검색 할 것입니다. 예를 들어, 다음 코드는 작동하지 않습니다.

#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. ==============================

    1.당신은 (여러 개의 키가 hmset를 사용하여 설정할 수 있습니다) hmset에 의해 그것을 할 수 있습니다.

    당신은 (여러 개의 키가 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. ==============================

    2.당신은 당신의 DICT 피클과 문자열로 저장할 수 있습니다.

    당신은 당신의 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. ==============================

    3.또 다른 방법 : 당신이 RedisWorks 라이브러리를 사용할 수 있습니다.

    또 다른 방법 : 당신이 RedisWorks 라이브러리를 사용할 수 있습니다.

    핍 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. ==============================

    4.당신은 레디 스에서 파이썬 딕셔너리를 저장할 경우, JSON 문자열로 저장하는 것이 좋습니다.

    당신은 레디 스에서 파이썬 딕셔너리를 저장할 경우, 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 기능에 의해 직렬화되지 않은 유형 (eg.bytes)에 대한?

    당신은 JSON 기능에 의해 직렬화 할 수없는 종류의 인코더 / 디코더 기능을 쓸 수 있습니다. 예를 들면. 바이트 어레이베이스 64 / ASCII 인코더 / 디코더 기능을 작성.

  5. ==============================

    5.기본적인 대답은 이미 다른 사람에 의해 제공되면서, 나는 몇 가지를 추가하고 싶습니다.

    기본적인 대답은 이미 다른 사람에 의해 제공되면서, 나는 몇 가지를 추가하고 싶습니다.

    HashMap의 / 사전 / 매핑 유형 값으로 기본 작업을 수행 할 수있는 레디 스의 명령은 다음과 같습니다.

    다음 레디 스-PY 라이브러리에 각각의 방법은 다음과 같습니다 -

    이 존재하지 않는 경우 위의 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']
    

    나는 일을 더 명확하게 희망.

  6. ==============================

    6.는 SET 명령 저장을 문자열이 아니라 임의의 데이터를 레디 스. 당신은 같은 뭔가 해시 레디 스로 DICT를 저장하기 위해이 HSET 명령을 레디 스 사용을 시도 할 수

    는 SET 명령 저장을 문자열이 아니라 임의의 데이터를 레디 스. 당신은 같은 뭔가 해시 레디 스로 DICT를 저장하기 위해이 HSET 명령을 레디 스 사용을 시도 할 수

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

    하지만 레디 스 데이터 유형 및 파이썬 데이터 유형은 매우 일치하지 않습니다. 파이썬 dicts 임의로 중첩 될 수 있지만, 레디 스 해시는 값이 문자열해야 할 것이다. 당신이 취할 수있는 또 다른 방법은 문자열에 파이썬 데이터를 변환하고 저장하는 것입니다 레디 스에서, 뭔가 같은

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

    당신이 얻을 때 다음 밖으로 문자열은 파이썬 개체를 다시 구문 분석해야합니다.

  7. ==============================

    7.당신이 문제를 접근 할 수있는 다른 방법 :

    당신이 문제를 접근 할 수있는 다른 방법 :

    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!
    

    내가 효율성 / 속도를 테스트하지 않았다.

  8. ==============================

    8.이 소개에서 2017 봐 이후 비교적 새로운 rejson-평을보십시오.

    이 소개에서 2017 봐 이후 비교적 새로운 rejson-평을보십시오.

    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)
    
  9. from https://stackoverflow.com/questions/32276493/how-to-store-and-retrieve-a-dictionary-with-redis by cc-by-sa and MIT license