Fazer um loop nos itens e acessar cada elemento de forma síncrona não é muito eficiente. Com o Redis 2.4, existem várias maneiras de fazer o que você deseja:
- usando o comando de classificação
- usando pipeline
- usando comandos de parâmetro variadic
Com o Redis 2.6, você também pode usar scripts Lua, mas isso não é realmente necessário aqui.
A propósito, a estrutura de dados que você descreveu pode ser melhorada usando hashes. Em vez de armazenar dados do usuário em chaves separadas, você pode agrupá-los em um objeto hash.
Usando o comando de classificação
Você pode usar o comando de classificação Redis para recuperar os dados em uma viagem de ida e volta.
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"
Usando pipeline
O cliente Ruby suporta pipeline (ou seja, a capacidade de enviar várias consultas ao Redis e aguardar várias respostas).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
O código acima recuperará os dados em apenas duas viagens de ida e volta.
Usando o comando de parâmetro variadic
O comando MGET pode ser usado para recuperar vários dados de uma só 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"
O custo aqui também é de duas ida e volta. Isso funciona se você puder garantir que o número de chaves a serem recuperadas seja limitado. Caso contrário, o pipelining é uma solução muito melhor.