Redis: 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.
1. 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 |
BASH
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}
2. SINTER: Interseção
Interseção retorna elementos que existem em todos os conjuntos especificados.
(1) 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"
(2) 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"
(3) Conjunto Inexistente
REDIS
# Se um conjunto não existir, é tratado como vazio
SINTER set1 naoexiste
(empty array)
(4) SINTERCARD: Cardinalidade da Interseção (Redis 7.0+)
REDIS
SINTERCARD 2 set1 set2
(integer) 2 # Interseção tem 2 elementos
3. SUNION: União
União retorna elementos que existem em qualquer um dos conjuntos.
(1) 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"
(2) 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"
4. SDIFF: Diferença
Diferença retorna elementos que estão no primeiro conjunto mas não em nenhum dos outros conjuntos.
(1) 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"
(2) 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.
5. Armazenando Resultados de Operações de Conjunto
(1) 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"
(2) 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"
(3) 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.
6. Casos de Uso de Operações de Conjunto
(1) 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"
(2) 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
(3) 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
(4) 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"
(5) 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
(6) 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"
7. Desempenho de Operações de Conjunto
(1) 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
8. 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) ...
(1) Corresponder Padrão
REDIS
# Obter apenas elementos que correspondem a um padrão
SSCAN large:set 0 MATCH user:*
9. 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.
▶ Exemplo
Operações de conjunto:
BASH
127.0.0.1:6379> SADD user:1:friends "Bob" "Charlie"
(integer) 2
127.0.0.1:6379> SADD user:2:friends "Alice" "Charlie"
(integer) 2
127.0.0.1:6379> SINTER user:1:friends user:2:friends
1) "Charlie"
127.0.0.1:6379> SDIFF user:1:friends user:2:friends
1) "Bob"
❓ 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 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
10. 📝 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
11. 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.
📝 Exercícios
- Prática: Execute os comandos apresentados nesta lição
- Experimentação: Teste variações dos comandos aprendidos
- Aplicação: Aplique os conceitos em um projeto prático