Hacer un bucle en los elementos y acceder de forma sincrónica a cada elemento no es muy eficiente. Con Redis 2.4, hay varias formas de hacer lo que quieras:
- usando el comando ordenar
- mediante canalización
- usando comandos de parámetros variables
Con Redis 2.6, también puede usar secuencias de comandos de Lua, pero esto no es realmente necesario aquí.
Por cierto, la estructura de datos que describiste podría mejorarse usando hashes. En lugar de almacenar datos de usuario en claves separadas, puede agruparlos en un objeto hash.
Uso del comando ordenar
Puede usar el comando de clasificación de Redis para recuperar los datos en un viaje de ida y vuelta.
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"
Uso de canalización
La canalización de soporte del cliente de Ruby (es decir, la capacidad de enviar varias consultas a Redis y esperar varias respuestas).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
El código anterior recuperará los datos en dos viajes de ida y vuelta solamente.
Uso del comando de parámetro variable
El comando MGET se puede utilizar para recuperar varios datos de una sola vez:
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"
El costo aquí también es de dos viajes de ida y vuelta. Esto funciona si puede garantizar que la cantidad de claves para recuperar es limitada. Si no, canalizar es una solución mucho mejor.