2016-06-04 7 views
1

ich einen Schlüssel in den redis wie folgt erstellt haben: -Redis - Get Werte in einem dict HMGET

In [1]: import redis 

In [2]: conn = redis.Redis('localhost') 

In [3]: user = { 
    ...:   'name': 'username', 
    ...:   'age': 25, 
    ...:   'likes': ['football', 'swimming'], 
    ...:   'response': { 
    ...:     'a': 1, 
    ...:     'b': 2 
    ...:   } 
    ...: } 

In [4]: conn.hmset("pythonDict", user) 
Out[4]: True 

In [5]: conn.hgetall("pythonDict") 
Out[5]: 
{'age': '25', 
'likes': "['football', 'swimming']", 
'name': 'username', 
'response': "{'a': 1, 'b': 2}" 
} 

So, jetzt will ich die Werte von name bekommen, age usw.

Ich tat folgendes: -

In [9]: conn.hmget("pythonDict","age", "likes") 
Out[9]: ['25', "['football', 'swimming']"] 

Arbeiten wie erwartet.

Jetzt bin ich an einem Punkt fest, wo ich den Wert a innerhalb der Antwort erhalten möchte. Wie kann ich direkt den Wert response[a] erhalten, ohne darüber zu iterieren, also nicht auf der Anwendungsebene ???

Antwort

0

Redis unterstützt keine verschachtelten Datenstrukturen in Hashes. Ihr Client hat sie (likes und response) als Strings codiert (wahrscheinlich mit repr(), aber vielleicht JSON), und hgetall() gibt sie als Strings zurück.

Also gibt es keinen Redis Befehl, der Ihnen den Wert a bringen wird. Sie könnten die verschachtelten Datenstrukturen jedoch explizit als JSON codieren und dann eine einfache Lua script schreiben, um den Wert auf dem Server zu extrahieren. Sie würden das mitgelieferte JSON library verwenden, um response auszupacken und den Wert a zurückzugeben.

+0

--- 'Ihr Client scheint sie (Likes und Response) als JSON-Strings codiert zu haben, und hgetall() gibt sie als Strings zurück. Dies ist das Standardverhalten von redis. Behandelt jeden Wert des Hash-Schlüssels als Zeichenfolge. – PythonEnthusiast

+0

@PythonEnthusiast: Es ist der Client, der entscheidet, welche Bytes an Redis gesendet werden sollen. Wenn Sie ein Python-Objekt übergeben, entscheidet der Client, wie es in eine Zeichenfolge umgewandelt wird. Es könnte 'str()' verwenden, es könnte 'repr()' verwenden, es könnte 'pickle' verwenden, es könnte JSON verwenden, es könnte eine Ausnahme auslösen usw. –

+0

Gibt es eine Möglichkeit,' lpush, lrange' zu ​​feuern Befehle an 'user ['likes']' direkt ?? Oder wird das auf Anwendungsebene gemacht? – PythonEnthusiast

Verwandte Themen