93 votes

comment stocker un objet complexe dans redis (en utilisant redis-py)

La fonction hmset peut définir la valeur de chaque champ, mais j'ai constaté que si la valeur elle-même est un objet structuré complexe, la valeur renvoyée par hget est une chaîne sérialisée, et non l'objet d'origine.

Par exemple

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, y a-t-il un moyen de résoudre ce problème en dehors de l'analyse manuelle de chaque champ ?

7voto

Vetal Latyshev Points 96

Vous pouvez utiliser RedisJSON de RedisLabs avec client pour python . Il prend en charge la structure de données imbriquées. Très utile pour des tâches comme celle-ci.

Un peu de code de l'exemple :

   # 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'))
   )

6voto

Erasmose Points 165

Vous pouvez utiliser RedisWorks bibliothèque.

pip install redisworks

>>> from redisworks import Root
>>> root = Root()
>>> root.something = {1:"a", "b": {2: 2}}  # saves it as Hash
>>> print(root.something)  # loads it from Redis
{'b': {2: 2}, 1: 'a'}
>>> root.something['b'][2]
2

Il convertit les types python en types Redis et vice-versa.

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

Disclaimer : J'ai écrit la bibliothèque. Voici le code : https://github.com/seperman/redisworks

0voto

riyas Points 61

J'ai récemment été confronté à un cas d'utilisation similaire. Stockage d'une structure de données complexe dans un hash redis.

Je pense que la meilleure façon de résoudre le problème est de sérialiser l'objet json en chaîne de caractères et de le stocker comme valeur pour un autre objet.

Exemple de script

Objet à stocker dans la table de hachage

const payload = {
 "k1":"v1",
 "k2": "v2",
 "k3": {
     "k4":"v4",
     "k5":"v5"
  }
}

Stocker cette charge utile en tant que

await redis.hmset('hashMapKey', {somePayloadKey: JSON.stringify(payload) });

Il peut être récupéré sous la forme suivante

      const result = await redis.hgetall('hashMapKey');
      const payload = JSON.parse(result.somePayloadKey);

hmset et hgetall sont tedis équivalents à HMSET et HGETALL dans redis.

J'espère que cela vous aidera.

0voto

ijaz khan Points 59
 for saving object in redis first convert object into stringify JSON
 StringifyImages = json.dumps(images)
redis.set('images', StringifyImages)

# Read stringify object from redis and parse it 
ParseImages = json.loads(redis.get('images'))

-3voto

fruitJuice Points 158

Vous pouvez simplement stocker votre structure telle quelle et effectuer un "eval" pour convertir la chaîne en objet :

images= [{'type':'big', 'url':'....'},
 {'type':'big', 'url':'....'},
 {'type':'big', 'url':'....'}]   
redis = Redis()
redis.hset('photo:1', 'images', images)

i = eval(redis.hget('photo:1', 'images'))
print type(i) #type of i should be list instead of string now

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X