Redis: Comandos Essenciais e Configurações Avançadas

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 do EXEC, 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:

  1. Copie o arquivo redis.conf para redis.slave.conf.
  2. Edite redis.slave.conf:
    • port 6380 (ou outra porta)
    • replicaof 127.0.0.1 6379 (endereço e porta do Master)
  3. Inicie o Redis com a nova configuração: redis-server redis.slave.conf
  4. 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

  1. Crie um diretório para o cluster (ex: redis-cluster).
  2. Dentro dele, crie subdiretórios para cada nó (ex: 7001, 7002, ... 7006).
  3. Em cada subdiretório, crie um arquivo redis.conf com configurações como:
    • port <n></n> (diferente para cada nó)
    • bind 127.0.0.1 (ou IP da máquina)
    • daemonize yes
    • cluster-enabled yes
    • cluster-config-file <nome_do_arquivo_config_cluster></nome_do_arquivo_config_cluster> (único para cada nó, ex: 7001_node.conf)
    • cluster-node-timeout 15000
    • appendonly yes
  4. Inicie cada nó Redis usando seu respectivo arquivo de configuração.
  5. 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.

Tags: Redis nosql chave-valor armazenamento em memória cache

Publicado em 7-30 04:44