comment stocker un objet complexe dans le redis (à l'aide de redis-py)
La hmset fonction peut définir la valeur de chaque champ, mais j'ai trouvé que si la valeur elle-même est une structure complexe, l'objet, la valeur de retour de hget est une chaîne sérialisée, pas l'objet d'origine
e.g
images= [{'type':'big', 'url':'....'},
{'type':'big', 'url':'....'},
{'type':'big', 'url':'....'}]
redis = Redis()
redis.hset('photo:1', 'images', images)
i = redis.hget('photo:1', 'images')
print type(i)
le type de i est une chaîne de caractères, pas un objet python, est-il un moyen de résoudre ce problème d'ailleurs manuellement analyser chaque champs?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas créer de structures imbriquées dans le Redis, ce qui signifie que vous ne pouvez pas (par exemple) pour stocker un natif redis liste à l'intérieur d'un natif redis hachage carte.
Si vous avez vraiment besoin de structures imbriquées, vous pouvez stocker un JSON-goutte (ou quelque chose de similaire) à la place. Une autre option est de conserver un "id"/clé à un autre redis objet que la valeur de la carte de clé, mais qui nécessite de multiples appels vers le serveur pour obtenir l'intégralité de l'objet.
En fait, vous pouvez stocker des objets python dans le redis en utilisant le module intégré cornichon.
Ici est un exemple.
JSON Exemple:
python 3:
redis.get()
? j'ai eub'['something']'
en python 3json.loads()
ne pas jouer gentil avecbytes
objets en python3. Vous aurez besoin de décoder lebytes
résultat deredis.get()
en python3str
. Voir la nouvelle édition.J'ai créé une bibliothèque, SubRedis, qui vous permet de créer beaucoup plus complexe structures et hiérarchies dans le redis. Si vous lui donnez un redis instance et d'un préfixe, il vous donne un peu près entièrement indépendant et capable redis instance.
SubRedis se termine juste en haut ajoutant la chaîne de caractères passée en elle comme un préfixe sur le plat redis structure de données. Pour moi c'est une pratique de l'enveloppe pour un patron que j'ai finit par faire beaucoup dans le redis -- ajoutant quelques id de nid de certaines données.
Vous pouvez utiliser
RedisWorks
bibliothèque.pip install redisworks
Il convertit python les types de Redis types et vice-versa.
Avertissement: j'ai écrit de la bibliothèque. Voici le code: https://github.com/seperman/redisworks
Ici est un simple wrapper autour de Redis qui cornichons/unpickles structures de données:
Si vous préférez-en-clair de données lisibles dans le redis (pickle stocke une version binaire), vous pouvez remplacer les cornichons.décharges avec des repr et cornichons.charges avec l'ast.literal_eval. Pour json, l'utilisation de json.décharges et json.les charges.
Si vous utilisez toujours les touches qui sont une simple chaîne de caractères, vous pouvez supprimer le décapage de la clé.
Vous pouvez stocker tout votre structure et à faire un 'eval' pour convertir de la Chaîne de l'Objet:
eval()
. Le JSON approche ne souffre pas de cette.