Conjuntos do Redis (Parte 2)

Esta lição aborda operações de interseção, união e diferença de conjuntos — os recursos mais poderosos dos sets.

Visão Geral das Operações de Conjunto

Redis suporta três operações de conjunto:

Operação Descrição Comando
Interseção Elementos presentes em todos os conjuntos SINTER
União Elementos presentes em qualquer conjunto SUNION
Diferença Elementos no primeiro conjunto mas não nos outros SDIFF
Set A: {1, 2, 3, 4}
Set B: {3, 4, 5, 6}

Interseção A∩B: {3, 4}
União A∪B: {1, 2, 3, 4, 5, 6}
Diferença A-B:  {1, 2}

SINTER: Interseção

Interseção retorna elementos que existem em todos os conjuntos especificados.

Uso Básico

REDIS
# Criar dois conjuntos
SADD set1 "a" "b" "c" "d"
SADD set2 "c" "d" "e" "f"

# Calcular interseção
SINTER set1 set2
1) "c"
2) "d"

Interseção de Múltiplos Conjuntos

REDIS
SADD set3 "c" "d" "g"

# Interseção de três conjuntos
SINTER set1 set2 set3
1) "c"
2) "d"

Conjunto Inexistente

REDIS
# Se um conjunto não existir, é tratado como vazio
SINTER set1 naoexiste
(empty array)

SINTERCARD: Cardinalidade da Interseção (Redis 7.0+)

REDIS
SINTERCARD 2 set1 set2
(integer) 2  # Interseção tem 2 elementos

SUNION: União

União retorna elementos que existem em qualquer um dos conjuntos.

Uso Básico

REDIS
SADD set1 "a" "b" "c"
SADD set2 "c" "d" "e"

# Calcular união
SUNION set1 set2
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"

União de Múltiplos Conjuntos

REDIS
SADD set3 "e" "f" "g"

# União de três conjuntos
SUNION set1 set2 set3
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"

SDIFF: Diferença

Diferença retorna elementos que estão no primeiro conjunto mas não em nenhum dos outros conjuntos.

Uso Básico

REDIS
SADD set1 "a" "b" "c" "d"
SADD set2 "c" "d" "e" "f"

# set1 - set2
SDIFF set1 set2
1) "a"
2) "b"

Diferença de Múltiplos Conjuntos

REDIS
SADD set3 "a" "g"

# set1 - set2 - set3
SDIFF set1 set2 set3
1) "b"  # a está em set3, então é excluído
⚠️ Observação: Diferença não é comutativa. SDIFF A BSDIFF B A.

Armazenando Resultados de Operações de Conjunto

SINTERSTORE: Armazenar Resultado da Interseção

REDIS
SADD set1 "a" "b" "c" "d"
SADD set2 "c" "d" "e" "f"

# Armazenar resultado da interseção em um novo conjunto
SINTERSTORE resultado set1 set2
(integer) 2  # Conjunto resultado tem 2 elementos

SMEMBERS resultado
1) "c"
2) "d"

SUNIONSTORE: Armazenar Resultado da União

REDIS
SUNIONSTORE resultado set1 set2
(integer) 6

SMEMBERS resultado
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"

SDIFFSTORE: Armazenar Resultado da Diferença

REDIS
SDIFFSTORE resultado set1 set2
(integer) 2

SMEMBERS resultado
1) "a"
2) "b"
💡 Caso de uso: Comandos *STORE salvam resultados em novos conjuntos para operações subsequentes ou cache.

Casos de Uso de Operações de Conjunto

Caso de Uso 1: Amigos em Comum

REDIS
# Amigos do Usuário 1
SADD user:1:friends "user:2" "user:3" "user:4" "user:5"

# Amigos do Usuário 2
SADD user:2:friends "user:3" "user:4" "user:6" "user:7"

# Amigos em comum
SINTER user:1:friends user:2:friends
1) "user:3"
2) "user:4"

Caso de Uso 2: Pessoas que Você Talvez Conheça

REDIS
# Meus amigos
SADD user:1:friends "user:2" "user:3"

# Amigos de amigos
SADD user:2:friends "user:3" "user:4" "user:5"
SADD user:3:friends "user:4" "user:6"

# União dos amigos de amigos
SUNIONSTORE friends:friends user:2:friends user:3:friends

# Amigos recomendados = amigos de amigos - meus amigos - eu
SADD me "user:1"
SUNIONSTORE excluir me user:1:friends
SDIFF friends:friends excluir

Caso de Uso 3: Recomendação de Artigo

REDIS
# Tags que o usuário curtiu
SADD user:1:liked:tags "redis" "database" "cache"

# Tags do artigo
SADD article:123:tags "redis" "nosql"
SADD article:456:tags "mysql" "database"
SADD article:789:tags "redis" "cache" "performance"

# Recomendar artigos que correspondem aos interesses do usuário (interseção de tags)
SINTER user:1:liked:tags article:123:tags
1) "redis"  # article:123 corresponde a 1 tag

SINTER user:1:liked:tags article:789:tags
1) "redis"
2) "cache"  # article:789 corresponde a 2 tags — recomendação mais forte

Caso de Uso 4: Filtragem de Produtos

REDIS
# Categorias de produtos
SADD category:phone "product:1" "product:2" "product:3"
SADD category:laptop "product:4" "product:5"

# Marcas de produtos
SADD brand:apple "product:1" "product:4"
SADD brand:samsung "product:2" "product:5"

# Filtrar: phone + marca Apple
SINTER category:phone brand:apple
1) "product:1"

Caso de Uso 5: Verificação de Permissões

REDIS
# Permissões do usuário
SADD user:1:permissions "read" "write" "delete"

# Permissões necessárias do recurso
SADD resource:123:required "read" "write"

# Verificar se o usuário tem todas as permissões necessárias
SINTER user:1:permissions resource:123:required
1) "read"
2) "write"

# Se a contagem do resultado for igual à contagem de permissões necessárias, o usuário está autorizado

Caso de Uso 6: Agregação de Tags

REDIS
# Tags de artigo
SADD article:1:tags "redis" "database"
SADD article:2:tags "redis" "cache"
SADD article:3:tags "mysql" "database"

# Todas as tags
SUNIONSTORE all:tags article:1:tags article:2:tags article:3:tags
SMEMBERS all:tags
1) "redis"
2) "database"
3) "cache"
4) "mysql"

Desempenho de Operações de Conjunto

Complexidade de Tempo

Comando Complexidade de Tempo Descrição
SINTER O(N*M) N = tamanho do menor conjunto, M = número de conjuntos
SUNION O(N) N = total de elementos em todos os conjuntos
SDIFF O(N) N = total de elementos em todos os conjuntos
⚠️ Dica de desempenho: Operações de conjunto percorrem todos os elementos. Conjuntos grandes podem ser lentos. Recomendações:

  • Use SINTERCARD em vez de SINTER (só retorna contagem)
  • Armazene resultados em cache (use comandos *STORE)
  • Limite o tamanho dos conjuntos

SSCAN: Iterar em Conjuntos Grandes

Para conjuntos grandes, use SSCAN para percorrer elementos em lotes.

REDIS
# Criar um conjunto grande
SADD large:set valor1 valor2 ... valor10000

# Iniciar iteração
SSCAN large:set 0
1) "127"          # Cursor para a próxima iteração
2) 1) "valor1"
   2) "valor2"
   ...

# Continuar iteração
SSCAN large:set 127
1) "0"            # Cursor 0 significa que a iteração está completa
2) ...

Corresponder Padrão

REDIS
# Obter apenas elementos que correspondem a um padrão
SSCAN large:set 0 MATCH user:*

Limitações do Set

1. Não Ordenado

REDIS
# Não pode obter elementos em uma ordem específica
SMEMBERS myset  # A ordem de retorno é indefinida

Para dados ordenados, use Sorted Sets.

2. Apenas Strings

REDIS
# Elementos do set só podem ser strings
SADD myset 123  # Armazena a string "123"

3. Sem Estruturas Aninhadas

Sets não suportam sets ou objetos aninhados.

❓ Perguntas Frequentes

P Qual é a diferença entre SINTER e SINTERSTORE?
R SINTER retorna o resultado da interseção; SINTERSTORE armazena o resultado em um novo conjunto.
P A diferença é comutativa?
R Não. SDIFF A BSDIFF B A. A ordem importa.
P Operações de conjunto modificam os conjuntos originais? *A: Não. SINTER/SUNION/SDIFF são somente leitura. Comandos STORE substituem o conjunto de destino.

Q: Como conto o tamanho da interseção sem obter elementos?

R Use SINTERCARD (Redis 7.0+), ou use SINTER + conte os resultados.
P Quão rápidas são as operações de conjunto?
R Depende do tamanho do conjunto. Operações em conjuntos grandes podem ser lentas — limite o tamanho dos conjuntos ou use cache.

📖 Resumo

  • SINTER: elementos presentes em todos os conjuntos
  • SUNION: elementos presentes em qualquer conjunto
  • SDIFF: elementos no primeiro conjunto mas não nos outros
  • Comandos *STORE salvam resultados de operações em novos conjuntos
  • Operações de conjunto para: amigos em comum, recomendações, filtragem, verificação de permissões
  • Desempenho: operações em conjuntos grandes são lentas — armazene em cache ou limite tamanhos
  • SSCAN itera em conjuntos grandes para evitar bloqueio

📝 Atividades

  1. Amigos em comum: Crie listas de amigos de dois usuários e encontre amigos em comum
  2. Sistema de recomendação: Implemente um sistema simples de recomendação de artigos baseado em tags de interesse do usuário
  3. Filtragem de produtos: Use conjuntos para filtragem de produtos com múltiplas condições (categoria + marca)
  4. Verificação de permissão: Use operações de conjunto para verificar se um usuário tem todas as permissões necessárias para um recurso

Próxima Lição

Na próxima lição, nós aprenderemos sobre Conjuntos Ordenados do Redis (Parte 1), abordando operações básicas de conjuntos ordenados.

100%