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' ], [