Introdução

O Redis é um datastore ou armazenamento de dados open-source de chave-valor na memória. Conjuntos ou Sets no Redis são coleções de strings armazenadas em uma determinada chave. Quando mantido em um conjunto, um valor de registro individual é referenciado como um member ou membro. Diferentemente das listas, os conjuntos não são ordenados e não permitem valores repetidos.

Este tutorial explica como criar conjuntos, recuperar e remover membros e comparar os membros de conjuntos diferentes.

Como Utilizar Este Guia

Este guia está no formato de referência rápida com trechos de linha de comando independentes. Recomendamos que você pule para qualquer seção que seja relevante para a tarefa que você está tentando concluir.

Os comandos mostrados neste guia foram testados em um servidor Ubuntu 18.04 executando a versão 4.0.9 do Redis. Para configurar um ambiente semelhante, você pode seguir o Passo 1 do nosso guia Como Instalar e Proteger o Redis no Ubuntu 18.04. Vamos demonstrar como esses comandos se comportam executando-os com redis-cli, a interface de linha de comando do Redis. Observe que se você estiver usando uma interface Redis diferente — Redli, por exemplo — a saída exata de certos comandos pode ser diferente.

Como alternativa, você pode provisionar uma instância de banco de dados Redis gerenciada para testar esses comandos, mas observe que, dependendo do nível de controle permitido pelo seu provedor de banco de dados, alguns comandos neste guia podem não funcionar como descrito. Para provisionar um banco de dados gerenciado na DigitalOcean, siga nossa documentação de produto para Managed Databases. Então, você deve instalar ou o Redli ou configurar um túnel TLS para conectar-se ao banco de dados gerenciado por TLS.

Criando Conjuntos

O comando sadd lhe permite criar um conjunto e adicionar um ou mais membros a ele. O exemplo a seguir criará um conjunto em uma chave chamada key_horror com os membros "Frankenstein" e "Godzilla":

  • sadd key_horror "Frankenstein" "Godzilla"

Se for bem-sucedido, o sadd retornará um número inteiro mostrando quantos membros foram adicionados ao conjunto:

Output
(integer) 2

Se você tentar adicionar membros de um conjunto a uma chave que já esteja mantendo um valor não definido, ele retornará um erro. O primeiro comando neste bloco cria uma lista chamada key_action com um elemento, "Shaft". O próximo comando tenta adicionar um membro de conjunto, "Shane", à lista, mas isso produz um erro devido aos tipos de dados conflitantes:

  • rpush key_action "Shaft"
  • sadd key_action "Shane"
Output
(error) WRONGTYPE Operation against a key holding the wrong kind of value

Observe que os conjuntos não permitem mais de uma ocorrência do mesmo membro:

  • sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
Output
(integer) 4

Embora esse comando sadd especifique oito membros, ele descarta quatro dos membros "Mad" repetidos, resultando em um tamanho de conjunto de 4 membros.

Recuperando Membros de Conjuntos

Nesta seção, abordaremos vários comandos Redis que retornam informações sobre os membros mantidos em um conjunto. Para praticar os comandos descritos aqui, execute o seguinte comando, que criará um conjunto com seis membros em uma chave chamada key_stooges:

  • sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"

Para retornar todos os membros de um conjunto, execute o comando smembers seguido da chave que você deseja inspecionar:

  • smembers key_stooges
Output
1) "Curly" 2) "Moe" 3) "Larry" 4) "Shemp" 5) "Curly Joe" 6) "Joe"

Para verificar se um valor específico é um membro de um conjunto, use o comando sismember:

  • sismember key_stooges "Harpo"

Se o elemento "Harpo" for um membro do conjunto key_stooges, o sismember retornará 1. Caso contrário, ele retornará 0:

Output
(integer) 0

Para ver quantos membros estão em um determinado conjunto (em outras palavras, para encontrar a cardinalidade de um determinado conjunto), execute scard:

  • scard key_stooges
Output
(integer) 6

Para retornar um elemento aleatório de um conjunto, execute srandmember:

  • srandmember key_stooges
Output
"Larry"

Para retornar vários elementos distintos e aleatórios de um conjunto, você pode seguir o comando srandmember com o número de elementos que você deseja recuperar:

  • srandmember key_stooges 3
Output
1) "Larry" 2) "Moe" 3) "Curly Joe"

Se você passar um número negativo para srandmember, o comando poderá retornar o mesmo elemento várias vezes:

  • srandmember key_stooges -3
Output
1) "Shemp" 2) "Curly Joe" 3) "Curly Joe"

A função de elemento aleatório usada no srandmember não é perfeitamente aleatória, embora seu desempenho melhore em conjuntos de dados maiores. Veja a documentação oficial do comando para mais detalhes.

Removendo Membros de Conjuntos

O Redis vem com três comandos usados para remover membros de um conjunto: spop,srem e smove.

O spop seleciona aleatoriamente um número especificado de membros de um conjunto e os retorna, semelhante ao srandmember, mas depois os exclui do conjunto. Ele aceita o nome da chave que contém um conjunto e o número de membros a serem removidos do conjunto como argumentos. Se você não especificar um número, o spop assumirá o padrão de retornar e remover um único valor.

O comando de exemplo a seguir removerá e retornará dois elementos selecionados aleatoriamente do conjunto key_stooges criado na seção anterior:

  • spop key_stooges 2
Output
1) "Shemp" 2) "Larry"

O srem permite remover um ou mais membros específicos de um conjunto, em vez de membros aleatórios:

  • srem key_stooges "Joe" "Curly Joe"

Em vez de retornar os membros removidos do conjunto, o srem retorna um número inteiro mostrando quantos membros foram removidos:

Output
(integer) 2

Use o smove para mover um membro de um conjunto para outro. Este comando aceita como argumentos o conjunto de origem, o conjunto de destino e o membro a ser movido nessa ordem. Observe que o smove permite mover apenas um membro de cada vez:

  • smove key_stooges key_jambands "Moe"

Se o comando mover o membro com sucesso, ele retornará (integer) 1:

Output
(integer) 1

Se o smove falhar, ele retornará (integer) 0. Observe que se a chave de destino ainda não existir, o smove a criará antes de mover o membro para ela.

Comparando Conjuntos

O Redis também fornece vários comandos que encontram as diferenças e semelhanças entre os conjuntos. Para demonstrar como eles funcionam, esta seção fará referência a três conjuntos denominados presidentes, reis e beatles. Se você quiser experimentar os comandos desta seção, crie esses conjuntos e preencha-os usando os seguintes comandos sadd:

  • sadd presidents "George" "John" "Thomas" "James"
  • sadd kings "Edward" "Henry" "John" "James" "George"
  • sadd beatles "John" "George" "Paul" "Ringo"

O sinter compara conjuntos diferentes e retorna a interseção dos conjuntos ou valores que aparecem em todos os conjuntos:

  • sinter presidents kings beatles
Output
1) "John" 2) "George"

O sinterstore executa uma função semelhante, mas em vez de retornar os membros da interseção, ele cria um novo conjunto no destino especificado que contém esses membros que fazem parte da interseção. Observe que se o destino já existir, o sinterstore substituirá o seu conteúdo:

  • sinterstore new_set presidents kings beatles
  • smembers new_set
Output
1) "John" 2) "George"

O sdiff retorna a diferença entre conjuntos - membros resultantes da diferença do primeiro conjunto especificado de cada um dos conjuntos seguintes:

  • sdiff presidents kings beatles
Output
1) "Thomas"

Em outras palavras, sdiff examina cada membro no primeiro conjunto fornecido e, em seguida, compara-os aos membros em cada conjunto sucessivo. Qualquer membro do primeiro conjunto que também apareça nos conjuntos seguintes é removido e o sdiff retorna os membros restantes. Pense nisso como remover membros de conjuntos subsequentes a partir do primeiro conjunto.

O sdiffstore executa uma função semelhante ao sdiff, mas, em vez de retornar a diferença dos conjuntos, ele cria um novo conjunto em um determinado destino, contendo a diferença de conjuntos:

  • sdiffstore new_set beatles kings presidents
  • smembers new_set
Output
1) "Paul" 2) "Ringo"

Como o sinterstore, o sdiffstore irá substituir a chave de destino, se ela já existir.

sunion retorna a união de conjuntos ou um conjunto que contém todos os membros de cada conjunto que você especificar:

  • sunion presidents kings beatles
Output
1) "Thomas" 2) "George" 3) "Paul" 4) "Henry" 5) "James" 6) "Edward" 7) "John" 8) "Ringo"

O sunion trata os resultados como um novo conjunto, em que permite apenas uma ocorrência de qualquer membro.

O sunionstore executa uma função semelhante, mas cria um novo conjunto contendo a união do conjunto em um determinado destino, em vez de apenas retornar os resultados:

  • sunionstore new_set presidents kings beatles
Output
(integer) 8

Tal como acontece com o sinterstore e o sdiffstore, o sunionstore substituirá a chave de destino, se ela já existir.

Conclusão

Este guia detalha vários comandos usados para criar e gerenciar conjuntos no Redis. Se houver outros comandos, argumentos ou procedimentos relacionados que você gostaria de ver descritos neste guia, peça ou faça sugestões nos comentários abaixo.

Para obter mais informações sobre comandos Redis, consulte nossa série de tutoriais Como Gerenciar um Banco de Dados Redis.

0 Comments

Creative Commons License