Strings do Redis (Parte 2)
Esta lição aborda operações numéricas e operações de bit em strings, permitindo casos de uso como contadores e estatísticas.
Operações Numéricas
Strings Redis podem armazenar inteiros e suportar operações numéricas atômicas.
INCR e DECR: Incrementar e Decrementar
REDIS
# Definir valor inicial
SET counter 10
# Incrementar em 1
INCR counter
(integer) 11
# Decrementar em 1
DECR counter
(integer) 10
💡 Atomicidade: INCR e DECR são operações atômicas. Múltiplos clientes podem INCR simultaneamente sem conflitos, tornando-os ideais para contadores.
INCRBY e DECRBY: Especificar Quantidade de Incremento
REDIS
SET counter 100
# Aumentar em 10
INCRBY counter 10
(integer) 110
# Diminuir em 20
DECRBY counter 20
(integer) 90
INCRBYFLOAT: Operações de Ponto Flutuante
REDIS
SET preco 10.5
# Aumentar em 2.3
INCRBYFLOAT preco 2.3
"12.8"
# Diminuir em 1.5 (passar um número negativo)
INCRBYFLOAT preco -1.5
"11.3"
⚠️ Observação: INCRBYFLOAT retorna um número de ponto flutuante em formato de string, não um inteiro.
Limitações das Operações Numéricas
REDIS
# Operações em strings não numéricas falharão
SET texto "olá"
INCR texto
(error) ERR value is not an integer or out of range
# Operar em uma chave que não existe (começa de 0)
INCR novocontador
(integer) 1 # Incrementado de 0 para 1
Caso de Uso: Contadores
REDIS
# Contagem de visualizações de artigo
INCR article:123:views
(integer) 1
# Contagem de curtidas do usuário
INCR user:456:likes
(integer) 1
# Contagem de chamadas de API
INCR api:usage:20260623
(integer) 1
Operações de Intervalo
GETRANGE: Obter Substring
REDIS
SET mensagem "Olá Redis Mundo"
# Obter primeiros 4 caracteres
GETRANGE mensagem 0 3
"Olá"
# Obter parte do meio
GETRANGE mensagem 5 9
"Redis"
# Obter últimos 5 caracteres
GETRANGE mensagem -5 -1
"Mundo"
# Obter string inteira
GETRANGE mensagem 0 -1
"Olá Redis Mundo"
💡 Regras de índice:
- Índices começam em 0
- A posição final é inclusiva
- Índices negativos contam a partir do final (-1 é o último caractere)
SETRANGE: Substituir Substring
REDIS
SET mensagem "Olá Mundo"
# Substituir começando na posição 4
SETRANGE mensagem 4 "Redis"
(integer) 10 # Retorna o tamanho da string
GET mensagem
"Olá Redis"
# Substituir além do tamanho original (preenchimento automático)
SET curto "Oi"
SETRANGE curto 5 "Pessoal"
(integer) 12
GET curto
"Oi\x00\x00\x00Pessoal" # Preenchido com bytes nulos no meio
⚠️ Observação: Se SETRANGE ultrapassar o tamanho original da string, o espaço é preenchido com bytes nulos (\x00).
Operações de Bit
Strings Redis suportam operações de bit, úteis para filtros Bloom, estatísticas de bitmap, etc.
SETBIT e GETBIT: Definir e Obter Bits
REDIS
# Definir bitmap (inicialmente todos 0s)
SETBIT meubitmap 0 1
(integer) 0 # Retorna valor antigo
SETBIT meubitmap 2 1
(integer) 0
SETBIT meubitmap 7 1
(integer) 0
# Obter valor do bit
GETBIT meubitmap 0
(integer) 1
GETBIT meubitmap 1
(integer) 0
GETBIT meubitmap 2
(integer) 1
BITCOUNT: Contar Bits Definidos como 1
REDIS
# Contar todos os bits
BITCOUNT meubitmap
(integer) 3 # 3 bits estão definidos como 1
# Contar dentro de um intervalo de bytes
BITCOUNT meubitmap 0 0
(integer) 3 # Byte 0 tem 3 bits definidos como 1
BITOP: Operações Bit a Bit
REDIS
# Criar dois bitmaps
SETBIT bitmap1 0 1
SETBIT bitmap1 1 1
SETBIT bitmap2 1 1
SETBIT bitmap2 2 1
# AND
BITOP AND resultado bitmap1 bitmap2
(integer) 1
GETBIT resultado 1
(integer) 1 # Apenas o bit 1 é 1 em ambos
# OR
BITOP OR resultado bitmap1 bitmap2
(integer) 1
# XOR
BITOP XOR resultado bitmap1 bitmap2
(integer) 1
# NOT (só suporta uma chave)
BITOP NOT resultado bitmap1
(integer) 1
BITPOS: Encontrar Primeira Posição 0 ou 1
REDIS
SET minhachave "\xff\xf0\x00" # Binário: 11111111 11110000 00000000
# Encontrar primeiro 0
BITPOS minhachave 0
(integer) 12 # Bit 12 é o primeiro 0
# Encontrar primeiro 1
BITPOS minhachave 1
(integer) 0 # Bit 0 é o primeiro 1
# Encontrar dentro de um intervalo de bytes
BITPOS minhachave 1 1 2
(integer) 8 # Dentro dos bytes 1-2, bit 8 é o primeiro 1
Caso de Uso: Check-in de Usuário
REDIS
# Usuário ID 123 faz check-in em 23 de junho de 2026 (dia 174 do ano)
SETBIT user:123:signin:2026 174 1
# Verificar se fez check-in
GETBIT user:123:signin:2026 174
(integer) 1
# Contar total de check-ins no ano
BITCOUNT user:123:signin:2026
(integer) 50 # Fez check-in em 50 dias
# Verificar check-ins consecutivos (requer BITPOS e lógica de negócio)
Caso de Uso: Estatísticas de Usuários Online
REDIS
# Usuário 123 fica online
SETBIT online:users 123 1
# Usuário 456 fica online
SETBIT online:users 456 1
# Contar usuários online
BITCOUNT online:users
(integer) 2
# Usuário 123 fica offline
SETBIT online:users 123 0
Dicas Práticas de String
1. Gerar IDs Únicos
REDIS
# Usar INCR para gerar IDs auto-incrementais
SET next:user:id 1000
INCR next:user:id
(integer) 1001 # Novo ID de usuário
INCR next:user:id
(integer) 1002
2. Contador de Limitação de Taxa
REDIS
# Limite de taxa de API: máximo 100 vezes por minuto
SET limit:api:user:1 0 EX 60
INCR limit:api:user:1
(integer) 1
# Verificar se o limite foi excedido
GET limit:api:user:1
"50" # Atualmente chamado 50 vezes
3. Número de Sequência Distribuído
REDIS
# Geração de número de pedido
SET order:sequence 1000000000
INCR order:sequence
(integer) 1000000001 # Novo número de pedido
4. Estatísticas de UV (Visitantes Únicos)
REDIS
# Usar bitmap para estatísticas de UV
SETBIT uv:20260623 12345 1 # Usuário ID 12345 visitou
SETBIT uv:20260623 67890 1 # Usuário ID 67890 visitou
# Contar UV
BITCOUNT uv:20260623
(integer) 2 # 2 visitantes únicos
Dicas de Otimização de Desempenho
1. Usar Operações em Lote
REDIS
# ❌ Múltiplas operações individuais
SET key1 "valor1"
SET key2 "valor2"
SET key3 "valor3"
# ✅ Operação em lote
MSET key1 "valor1" key2 "valor2" key3 "valor3"
2. Definir Expiração Razoável
REDIS
# Definir expiração para dados em cache
SET cache:key "valor" EX 3600
# Evitar avalanche de cache: adicionar jitter aleatório ao TTL
SET cache:key "valor" EX 3600
3. Escolher a Codificação Correta
REDIS
# Strings curtas usam codificação embstr (<= 44 bytes)
SET curta "Olá Redis"
# Strings longas usam codificação raw
SET longa "Esta é uma string muito longa..."
# Verificar codificação
OBJECT ENCODING curta
"embstr"
❓ Perguntas Frequentes
P INCR pode causar overflow?
R Sim. Inteiros Redis são inteiros com sinal de 64 bits (intervalo: -2^63 a 2^63-1). Sair do intervalo retornará um erro.
P Como implemento um contador de ponto flutuante?
R Use o comando INCRBYFLOAT, mas note que ele retorna um formato de string.
P Quais são os usos práticos para operações de bit?
R Bitmaps podem ser usados para check-in de usuários, estatísticas de usuários online, filtros Bloom, bits de permissão — muito eficientes em memória.
P Qual é a complexidade de tempo do GETRANGE?
R O(N), onde N é o tamanho da substring retornada. Obter substrings curtas é muito rápido.
P Como armazeno texto grande (como conteúdo de artigo)?
R Considere comprimi-lo primeiro, ou fragmentá-lo. Uma abordagem melhor é armazená-lo em um sistema de arquivos ou armazenamento de objetos e manter apenas a URL no Redis.
📖 Resumo
- INCR/DECR incremento e decremento atômicos, ideais para contadores
- INCRBY/DECRBY para incrementos personalizados, INCRBYFLOAT para floats
- GETRANGE/SETRANGE operações de intervalo, suportam indexação negativa
- SETBIT/GETBIT operações de bit, úteis para estatísticas de bitmap
- BITCOUNT conta bits definidos como 1, BITOP para operações bit a bit
- Aplicações de bitmap: check-in de usuários, usuários online, estatísticas de UV
- Operações numéricas: contadores, limitação de taxa, geração de ID único
📝 Atividades
- Contador: Implemente um contador de visualizações de artigo, simule 10 visualizações e verifique a contagem final
- Operações de intervalo: Defina uma string longa e use GETRANGE para recuperar diferentes partes
- Check-in com bitmap: Use um bitmap para implementar check-in de usuário e contar dias de check-in
- Estatísticas de UV: Use um bitmap para rastrear UVs do site, simulando múltiplas visitas de usuários
Próxima Lição
Na próxima lição, nós aprenderemos sobre Hashes do Redis (Parte 1), abordando operações básicas de hash.



