O Redis é um banco de dados NoSQL de chave-valor de alta performance, escrito em C ANSI, licenciado sob a licença BSD. Ele opera principalmente em memória, mas também oferece persistência em disco e suporta estruturas de dados como Strings, Lists, Sets, Sorted Sets e Hashes.
Principais características do Redis:
- Persistência: Capacidade de salvar dados da memória em disco para recuperação após reinicializações.
- Estruturas de Dados Ricas: Suporte nativo para diversas estruturas além de simples pares chave-valor.
- Backup: Funcionalidade de backup através de replicação Master-Slave.
- Alta Performance: Velocidades de leitura de até 110.000 ops/s e escrita de até 81.000 ops/s.
- Atomicidade e Transações: Operações atômicas e suporte a transações.
- Recursos Adicionais: Inclui publish/subscribe, notificações e expiração de chaves.
Instalação do Redis
Windows
Download: Visite a página de releases do projeto no GitHub: https://github.com/microsoftarchive/redis/releases
Iniciar Servidor:
redis-server redis.windows.conf
Instalar como Serviço do Windows:
redis-server --service-install redis.windows.conf
Parar Serviço:
redis-server --service-stop
Iniciar Cliente:
redis-cli
Conectar com Parâmetros Específicos:
redis-cli -h <ip> -p <porta> -a <senha></senha></porta></ip>
Desligar Cliente:
redis-cli -p <porta> shutdown</porta>
Linux
Download:
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
Descompactar:
tar xzf redis-5.0.7.tar.gz
Mover para /usr/local:
mv ./redis-5.0.7/* /usr/local/redis/
Entrar no diretório:
cd /usr/local/redis/
Compilar:
sudo make
Testar:
sudo make test
Instalar:
sudo make install
Mac
Download:
http://download.redis.io/releases/redis-5.0.7.tar.gz
Descompactar:
tar zxvf redis-4.0.10.tar.gz
Compilar e Testar:
sudo make test
Compilar e Instalar:
sudo make install
Configurações Comuns do redis.conf
| Configuração | Descrição | Padrão |
|---|---|---|
bind |
Define os IPs que podem acessar o Redis. Se vazio ou 0.0.0.0, aceita conexões de todas as interfaces de rede. Evita exposição desnecessária. |
127.0.0.1 |
protected-mode |
Modo de segurança introduzido no Redis 3.2. Ativo se bind não estiver definido e nenhuma senha for configurada. Limita o acesso local quando não há senha. |
yes |
port |
Porta de acesso do Redis. Padrão é 6379. Pode ser alterada para executar múltiplas instâncias em um único servidor. | 6379 |
timeout |
Tempo em segundos de inatividade após o qual um cliente é desconectado. 0 desabilita o timeout. |
0 |
daemonize |
Define se o Redis deve rodar como um processo em background (daemon). | no |
pidfile |
Caminho para o arquivo PID quando o Redis roda como daemon. | /var/run/redis_6379.pid |
loglevel |
Nível de verbosidade dos logs. Opções: debug, verbose, notice, warning. |
notice |
logfile |
Caminho para o arquivo de log. Se vazio, os logs são impressos no terminal. | "" |
databases |
Número de bancos de dados disponíveis. | 16 |
save |
Configura a persistência RDB. Define regras para salvar o estado em disco (ex: save 900 1 - salvar se houve 1 alteração nos últimos 900 segundos). |
save 900 1 save 300 10 save 60 10000 |
requirepass |
Define a senha para autenticação de clientes. | Desabilitado |
maxclients |
Número máximo de clientes simultâneos permitidos. | 10000 (desabilitado implicitamente) |
maxmemory |
Limite de memória a ser usado pelo Redis. Se atingido, as políticas de remoção (eviction) são ativadas. | Desabilitado |
Comandos Essenciais do Redis
- Selecionar Banco de Dados:
select <índice>(ex:select 1) - Limpar Banco de Dados Atual:
flushdb - Ver Todas as Chaves:
keys * - Deletar Chave:
del <chave></chave> - Verificar Existência de Chave:
exists <chave></chave>(retorna 1 se existe, 0 caso contrário) - Definir Tempo de Expiração:
expire <chave> <segundos></segundos></chave>(ex:expire meu_key 100) - Verificar Tempo de Expiração:
ttl <chave></chave>(retorna -1 para chave permanente, -2 para chave inexistente) - Remover Tempo de Expiração:
persist <chave></chave>(torna a chave permanente) - Buscar Chaves com Padrão:
keys <padr></padr>(*para qualquer caractere,?para um único caractere) - Obter Chave Aleatória:
randomkey - Renomear Chave:
rename <chave_antiga> <chave_nova></chave_nova></chave_antiga> - Mover Chave para outro Banco:
move <chave> <índice_db></chave> - Verificar Tipo da Chave:
type <chave></chave>
Comandos para Strings
- Definir Valor:
set <chave> <valor></valor></chave> - Obter Valor:
get <chave></chave> - Definir Valor se Não Existe:
setnx <chave> <valor></valor></chave> - Obter Substring:
getrange <chave> <in> <fim></fim></in></chave>(ex:getrange minha_string 0 3) - Obter e Definir Valor:
getset <chave> <novo_valor></novo_valor></chave> - Obter Comprimento da String:
strlen <chave></chave> - Incrementar Valor Numérico:
incr <chave></chave> - Decrementar Valor Numérico:
decr <chave></chave> - Incrementar por Valor Específico:
incrby <chave> <incremento></incremento></chave>(ex:incrby contador 10)
Comandos para Hashes
- Definir Campo/Valor:
hset <chave> <campo> <valor></valor></campo></chave>(ex:hset usuario:1 idade 12) - Obter Valer de Campo:
hget <chave> <campo></campo></chave>(ex:hget usuario:1 idade) - Definir Múltiplos Campos/Valores:
hmset <chave> <campo1> <valor1> [<campo2> <valor2> ...]</valor2></campo2></valor1></campo1></chave>(ex:hmset usuario:2 nome zhansan idade 12) - Obter Valores de Múltiplos Campos:
hmget <chave> <campo1> [<campo2> ...]</campo2></campo1></chave>(ex:hmget usuario:2 nome) - Obter Todos os Campos/Valores:
hgetall <chave></chave>(ex:hgetall usuario:2) - Obter Todos os Campos:
hkeys <chave></chave>(ex:hkeys usuario:2) - Obter Número de Campos:
hlen <chave></chave> - Deletar Campo(s):
hdel <chave> <campo1> [<campo2> ...]</campo2></campo1></chave>(ex:hdel usuario:2 nome) - Incrementar Campo Numérico:
hincrby <chave> <campo> <incremento></incremento></campo></chave>(ex:hincrby usuario:2 idade 1) - Verificar Existência de Campo:
hexists <chave> <campo></campo></chave>(retorna 1 se existe, 0 caso contrário)
Comandos para Lists
Cenários: Filas de mensagens, listas de artigos paginadas.
- Adicionar à Esquerda:
lpush <chave> <valor1> <valor2> ...</valor2></valor1></chave>(ex:lpush minha_lista 1 2 3- a lista resultante é3, 2, 1) - Adicionar à Direita:
rpush <chave> <valor1> <valor2> ...</valor2></valor1></chave> - Obter Intervalo:
lrange <chave> <in> <fim></fim></in></chave> - Definir Valor por Índice:
lset <chave> <índice> <valor></valor></chave> - Obter Comprimento da Lista:
llen <chave></chave> - Obter Valor por Índice:
lindex <chave> <índice></chave> - Remover da Esquerda:
lpop <chave></chave> - Remover da Direita:
rpop <chave></chave> - Manter Apenas um Intervalo:
ltrim <chave> <in> <fim></fim></in></chave> - Inserir Elemento (antes ou depois de outro):
linsert <chave> BEFORE|AFTER <piv> <valor></valor></piv></chave> - Remover Elementos:
lrem <chave> <contagem> <valor></valor></contagem></chave>(contagem: 0 remove todos, >0 remove do início, <0 remove do fim)
Comandos para Sets
Conjuntos não ordenados de strings únicas.
- Adicionar Membros:
sadd <chave> <membro1> <membro2> ...</membro2></membro1></chave> - Ver Todos os Membros:
smembers <chave></chave> - Obter Número de Membros:
scard <chave></chave> - Verificar se Membro Existe:
sismember <chave> <membro></membro></chave> - Obter Membro(s) Aleatório(s):
srandmember <chave> [contagem]</chave> - Remover Membro(s):
srem <chave> <membro1> [<membro2> ...]</membro2></membro1></chave> - Remover e Retornar Membro Aleatório:
spop <chave></chave> - Mover Membro para Outro Set:
smove <source> <destination> <membro></membro></destination></source> - Diferença de Conjuntos:
sdiff <chave1> [<chave2> ...]</chave2></chave1> - Diferença e Armazenar em Destino:
sdiffstore <destination> <chave1> [<chave2> ...]</chave2></chave1></destination> - Interseção de Conjuntos:
sinter <chave1> [<chave2> ...]</chave2></chave1> - Interseção e Armazenar em Destino:
sinterstore <destination> <chave1> [<chave2> ...]</chave2></chave1></destination> - União de Conjuntos:
sunion <chave1> [<chave2> ...]</chave2></chave1> - União e Armazenar em Destino:
sunionstore <destination> <chave1> [<chave2> ...]</chave2></chave1></destination>
Comandos para Sorted Sets (Zsets)
Conjuntos ordenados por score (peso).
- Adicionar Membros com Score:
zadd <chave> <score1> <membro1> [<score2> <membro2> ...]</membro2></score2></membro1></score1></chave>(ex:zadd ranking 7 zs 8 ls 9 zl) - Obter Membros por Intervalo de Índice:
zrange <chave> <in> <fim> [WITHSCORES]</fim></in></chave> - Contar Membros em Intervalo de Score:
zcount <chave> <min_score> <max_score></max_score></min_score></chave> - Obter Número de Membros:
zcard <chave></chave> - Obter Rank (índice) de Membro:
zrank <chave> <membro></membro></chave>(ordem crescente de score) - Obter Membros por Intervalo de Índice (ordem decrescente):
zrevrange <chave> <in> <fim> [WITHSCORES]</fim></in></chave> - Remover Membro(s):
zrem <chave> <membro1> [<membro2> ...]</membro2></membro1></chave> - Remover Membros por Intervalo de Score:
zremrangebyscore <chave> <min_score> <max_score></max_score></min_score></chave> - Remover Membros por Intervalo de Rank:
zremrangebyrank <chave> <in> <fim></fim></in></chave>
Publicação/Assinatura (Pub/Sub)
- Assinar Canal:
subscribe <canal1> [<canal2> ...]</canal2></canal1> - Publicar Mensagem:
publish <canal> <mensagem></mensagem></canal> - Cancelar Assinatura:
unsubscribe <canal1> [<canal2> ...]</canal2></canal1>
Transações no Redis
Permitem executar uma sequência de comandos de forma atômica e isolada.
MULTI: Inicia um bloco de transação.EXEC: Executa todos os comandos dentro do bloco de transação.DISCARD: Cancela a transação.WATCH <chave1> [<chave2> ...]</chave2></chave1>: Monitora chaves. Se alguma chave monitorada for alterada antes doEXEC, a transação é abortada.UNWATCH: Cancela o monitoramento de chaves.
Exemplo:
SET usuario:A 100
SET usuario:B 50
WATCH usuario:A
MULTI
DECRBY usuario:A 50
INCRBY usuario:B 50
EXEC
GET usuario:A
GET usuario:B
Persistência no Redis
O Redis oferece duas estratégias principais de persistência:
RDB (Redis Database)
Vantagens:
- Arquivos compactos.
- Recuperação mais rápida (snapshot).
- Menor impacto na performance do processo principal (usa fork).
Desvantagens:
- Potencial perda de dados entre os snapshots (configurável, mas mínima em intervalos curtos).
- Pode impactar a performance em grandes volumes de dados durante o fork.
AOF (Append Only File)
Vantagens:
- Maior durabilidade dos dados (configurável, até perda mínima de 1 segundo com
everysec). - Capacidade de reescrever o arquivo para otimizar o tamanho (
auto-aof-rewrite).
Desvantagens:
- Performance potencialmente infreior devido às operações de I/O mais frequentes.
- Arquivos geralmente maiores que RDB.
- Recuperação pode ser mais lenta.
Estratégias de Expiração de Chaves
O Redis gerencia chaves expiradas através de:
- Expiração Programada (Scheduled Expiration): Timers criados para cada chave expirada, limpando-as imediatamente. Bom para a memória, mas consome CPU.
- Expiração Preguiçosa (Lazy Expiration): A expiração é verificada apenas quando a chave é acessada. Economiza CPU, mas pode levar a um acúmulo de chaves expiradas na memória.
- Expiração Periódica (Periodic Expiration): Scans periódicos de um número limitado de chaves em intervalos regulares para remover as expiradas. É um equilíbrio entre as duas anteriores.
O Redis utiliza uma combinação de Expiração Preguiçosa e Periódica.
Políticas de Remoção de Memória (Memory Eviction)
Quando a memória está cheia e uma nova escrita é necessária, uma das seguintes políticas é aplicada:
noeviction: Novas escritas falham com erro.allkeys-lru: Remove a chave usada menos recentemente de todas as chaves.allkeys-random: Remove uma chave aleatória de todas as chaves.volatile-lru: Remove a chave com expiração definida e usada menos recentemente.volatile-random: Remove uma chave com expiração definida aleatoriamente.volatile-ttl: Remove a chave com expiração definida e menor tempo de vida restante.
Replicação Master-Slave
Permite criar cópias de dados e implementar leitura/escrita separadas.
- Um Master pode ter múltiplos Slaves.
- Dados são replicados automaticamente do Master para os Slaves.
- O Master lida com escritas, enquanto os Slaves podem lidar com leituras.
Configuração Básica de um Slave:
- Copie o arquivo
redis.confpararedis.slave.conf. - Edite
redis.slave.conf:port 6380(ou outra porta)replicaof 127.0.0.1 6379(endereço e porta do Master)
- Inicie o Redis com a nova configuração:
redis-server redis.slave.conf - Verifique a relação de replicação:
redis-cli -h <ip> INFO Replication</ip>
Redis Cluster
Proporciona alta disponibilidade, escalabilidade e distribuição de dados sem um ponto central de falha.
Configuração
- Crie um diretório para o cluster (ex:
redis-cluster). - Dentro dele, crie subdiretórios para cada nó (ex:
7001,7002, ...7006). - Em cada subdiretório, crie um arquivo
redis.confcom configurações como:port <n></n>(diferente para cada nó)bind 127.0.0.1(ou IP da máquina)daemonize yescluster-enabled yescluster-config-file <nome_do_arquivo_config_cluster></nome_do_arquivo_config_cluster>(único para cada nó, ex:7001_node.conf)cluster-node-timeout 15000appendonly yes
- Inicie cada nó Redis usando seu respectivo arquivo de configuração.
- Crie o cluster (requer pelo menos 3 masters): ```
redis-cli --cluster create ... --cluster-replicas
(Ex: `redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 --cluster-replicas 1`)
Conectando ao Cluster
redis-cli -c -h 127.0.0.1 -p 7001
(O flag -c habilita o modo cluster aware, que redireciona comandos para o nó correto).
Conhecimentos sobre Cluster:
- Estrutura descentralziada, todos os nós são iguais.
- Usa o conceito de Hash Slots (16384 slots no total) para distribuir chaves. A alocação é feita via
CRC16(chave) % 16384. - Cada master é responsável por um conjunto de slots e mantém cópias em seus slaves.
- Um slave assume como master se o master original falhar.
- Requer no mínimo 3 masters para criação. A escrita só funciona se mais da metade dos masters estiverem online.