Cliente Redis para Node.js: ioredis
Redis é um armazenamento de dados em memória de alto desempenho, frequentemente usado como banco de dados, cache e broker de mensagens. Para interagir com o Redis a partir do Node.js, existem várias bibliotecas, mas uma das mais populares e funcionais é o ioredis. Esta biblioteca fornece uma API completa, performática e conveniente para trabalhar com Redis, suportando todos os recursos modernos, incluindo clusterização, pub/sub, transações e scripts Lua.
Neste artigo, vamos explorar detalhadamente o ioredis, sua instalação, principais funcionalidades e fornecer exemplos práticos de código em JavaScript (Node.js).
Instalação e conexão
A instalação do ioredis via npm ou yarn é simples:
npm install ioredis# ouyarn add ioredisApós a instalação, crie uma instância do cliente:
const Redis = require('ioredis');const redis = new Redis(); // padrão localhost:6379
// Ou com parâmetros explícitosconst redis = new Redis({ host: 'localhost', port: 6379, password: 'sua_senha', // se uma senha foi definida db: 0});A biblioteca suporta Promise e async/await, tornando o código limpo e legível.
Operações básicas com dados
O ioredis permite executar todos os comandos Redis padrão. Vejamos exemplos de trabalho com strings, listas e hashes.
Trabalhando com strings
async function stringExample() { await redis.set('user:1:nome', 'Alexey'); const nome = await redis.get('user:1:nome'); console.log(nome); // Alexey
// Definindo com tempo de expiração (TTL) await redis.setex('temp:codigo', 60, '123456'); // vive por 60 segundos}Trabalhando com listas
async function listExample() { await redis.lpush('fila:tarefas', 'tarefa1', 'tarefa2'); await redis.rpush('fila:tarefas', 'tarefa3'); const tarefas = await redis.lrange('fila:tarefas', 0, -1); console.log(tarefas); // ['tarefa2', 'tarefa1', 'tarefa3']}Trabalhando com hashes
async function hashExample() { await redis.hset('user:1', { nome: 'Maria', idade: 28, cidade: 'Moscou' }); const idade = await redis.hget('user:1', 'idade'); console.log(idade); // 28
const todosDados = await redis.hgetall('user:1'); console.log(todosDados); // { nome: 'Maria', idade: '28', cidade: 'Moscou' }}Pub/Sub (publicador-assinante)
O Redis suporta o padrão pub/sub, e o ioredis fornece uma interface conveniente para isso. Importante: o assinante deve usar uma conexão separada.
// Assinanteconst subscriber = new Redis();subscriber.subscribe('noticias', 'atualizacoes', (err, count) => { console.log(`Inscrito em ${count} canais`);});
subscriber.on('message', (canal, mensagem) => { console.log(`Recebido de ${canal}: ${mensagem}`);});
// Publicador (pode estar em outro processo)const publisher = new Redis();publisher.publish('noticias', 'Olá, mundo!');publisher.publish('atualizacoes', 'Versão 2.0 lançada');Trabalhando com cluster Redis
O ioredis suporta muito bem a clusterização. Você só precisa passar a lista de nós do cluster:
const cluster = new Redis.Cluster([ { host: 'node1.exemplo.com', port: 6379 }, { host: 'node2.exemplo.com', port: 6379 }, { host: 'node3.exemplo.com', port: 6379 }]);
async function clusterExample() { await cluster.set('chave', 'valor'); const val = await cluster.get('chave'); console.log(val); // valor}A biblioteca lida automaticamente com o redirecionamento de comandos entre nós (MOVED, ASK) e suporta slots.
Transações e pipelines
Para execução atômica de múltiplos comandos, use transações (MULTI/EXEC). Para melhorar a performance, use pipelines.
Transações
async function transaction