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 B ≠ SDIFF 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 B ≠ SDIFF 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
- Amigos em comum: Crie listas de amigos de dois usuários e encontre amigos em comum
- Sistema de recomendação: Implemente um sistema simples de recomendação de artigos baseado em tags de interesse do usuário
- Filtragem de produtos: Use conjuntos para filtragem de produtos com múltiplas condições (categoria + marca)
- 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.



