Redis
 sql >> Base de données >  >> NoSQL >> Redis

Obtenir plusieurs valeurs clés de Redis

Faire une boucle sur les éléments et accéder de manière synchrone à chaque élément n'est pas très efficace. Avec Redis 2.4, il existe différentes manières de faire ce que vous voulez :

  • en utilisant la commande de tri
  • en utilisant le pipeline
  • en utilisant des commandes de paramètres variadiques

Avec Redis 2.6, vous pouvez également utiliser les scripts Lua, mais ce n'est pas vraiment nécessaire ici.

Soit dit en passant, la structure de données que vous avez décrite pourrait être améliorée en utilisant des hachages. Au lieu de stocker les données utilisateur dans des clés distinctes, vous pouvez les regrouper dans un objet de hachage.

Utiliser la commande de tri

Vous pouvez utiliser la commande de tri Redis pour récupérer les données en un aller-retour.

redis> set users:1:name "daniel"
OK
redis> set users:1:age 24
OK
redis> set users:2:name "user2"
OK
redis> set users:2:age 24
OK
redis> sadd events:1:attendees users:1 users:2
(integer) 2
redis> sort events:1:attendees by nosort get *:name get *:age
1) "user2"
2) "24"
3) "daniel"
4) "24"

Utilisation du pipeline

Le client Ruby prend en charge le pipelining (c'est-à-dire la possibilité d'envoyer plusieurs requêtes à Redis et d'attendre plusieurs réponses).

keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
   keys.each do |x|
      $redis.mget(x+":name",x+":age")
   end
end

Le code ci-dessus récupérera les données en deux allers-retours seulement.

Utilisation de la commande de paramètre variadique

La commande MGET permet de récupérer plusieurs données d'un coup :

redis> smembers events:1:attendees
1) "users:2"
2) "users:1"
redis> mget users:1:name users:1:age users:2:name users:2:age
1) "daniel"
2) "24"
3) "user2"
4) "24"

Le coût ici est également de deux allers-retours. Cela fonctionne si vous pouvez garantir que le nombre de clés à récupérer est limité. Sinon, le pipelining est une bien meilleure solution.