Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Obtendo vários valores de chave do Redis


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.