Redis клиент для Node.js: ioredis — мощный инструмент для работы с Redis

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Redis клиент для Node.js: ioredis

Redis — это высокопроизводительное хранилище данных в памяти, часто используемое как база данных, кэш и брокер сообщений. Для взаимодействия с Redis из Node.js существует несколько библиотек, но одной из самых популярных и функциональных является ioredis. Эта библиотека предоставляет полноценный, производительный и удобный API для работы с Redis, поддерживая все современные возможности, включая кластеризацию, pub/sub, транзакции и Lua-скрипты.

В этой статье мы подробно рассмотрим ioredis, его установку, основные возможности и приведем практические примеры кода на JavaScript (Node.js).

Установка и подключение

Установка ioredis через npm или yarn не вызывает сложностей:

npm install ioredis
# или
yarn add ioredis

После установки создайте экземпляр клиента:

const Redis = require('ioredis');
const redis = new Redis(); // по умолчанию localhost:6379

// Или с явными параметрами
const redis = new Redis({
  host: 'localhost',
  port: 6379,
  password: 'your_password', // если установлен пароль
  db: 0
});

Библиотека поддерживает Promise и async/await, что делает код чистым и читаемым.

Основные операции с данными

ioredis позволяет выполнять все стандартные команды Redis. Рассмотрим примеры работы со строками, списками и хешами.

Работа со строками

async function stringExample() {
  await redis.set('user:1:name', 'Алексей');
  const name = await redis.get('user:1:name');
  console.log(name); // Алексей

  // Установка с истечением времени (TTL)
  await redis.setex('temp:code', 60, '123456'); // живет 60 секунд
}

Работа со списками

async function listExample() {
  await redis.lpush('queue:tasks', 'task1', 'task2');
  await redis.rpush('queue:tasks', 'task3');
  const tasks = await redis.lrange('queue:tasks', 0, -1);
  console.log(tasks); // ['task2', 'task1', 'task3']
}

Работа с хешами

async function hashExample() {
  await redis.hset('user:1', {
    name: 'Мария',
    age: 28,
    city: 'Москва'
  });
  const age = await redis.hget('user:1', 'age');
  console.log(age); // 28

  const allData = await redis.hgetall('user:1');
  console.log(allData);
  // { name: 'Мария', age: '28', city: 'Москва' }
}

Pub/Sub (издатель-подписчик)

Redis поддерживает паттерн pub/sub, и ioredis предоставляет удобный интерфейс для этого. Важно: подписчик должен использовать отдельное соединение.

// Подписчик
const subscriber = new Redis();
subscriber.subscribe('news', 'updates', (err, count) => {
  console.log(`Подписан на ${count} каналов`);
});

subscriber.on('message', (channel, message) => {
  console.log(`Получено из ${channel}: ${message}`);
});

// Издатель (может быть в другом процессе)
const publisher = new Redis();
publisher.publish('news', 'Привет, мир!');
publisher.publish('updates', 'Версия 2.0 вышла');

Работа с кластером Redis

ioredis отлично поддерживает кластеризацию. Вам нужно лишь передать список узлов кластера:

const cluster = new Redis.Cluster([
  { host: 'node1.example.com', port: 6379 },
  { host: 'node2.example.com', port: 6379 },
  { host: 'node3.example.com', port: 6379 }
]);

async function clusterExample() {
  await cluster.set('key', 'value');
  const val = await cluster.get('key');
  console.log(val); // value
}

Библиотека автоматически обрабатывает перенаправление команд между узлами (MOVED, ASK) и поддерживает слоты.

Транзакции и конвейеры

Для атомарного выполнения нескольких команд используйте транзакции (MULTI/EXEC). Для повышения производительности — конвейеры (pipeline).

Транзакции

async function transactionExample() {
  const result = await redis.multi()
    .set('key1', 'value1')
    .get('key1')
    .incr('counter')
    .exec();

  console.log(result);
  // [ [ null, 'OK' ], [ null, 'value1' ], [ null, 1 ] ]
}

Конвейеры

async function pipelineExample() {
  const pipeline = redis.pipeline();
  pipeline.set('key1', 'val1');
  pipeline.set('key2', 'val2');
  pipeline.get('key1');
  pipeline.get('key2');
  
  const results = await pipeline.exec();
  console.log(results);
  // [ [ null, 'OK' ], [                    

Рекомендаций