Redis — это быстрое и эффективное хранилище ключей в памяти. Он также известен как сервер структуры данных, поскольку ключи могут содержать строки, списки, наборы, хэши и другие структуры данных. Если вы используете Node.js, вы можете использовать модуль node_redis
для взаимодействия с Redis. В этом руководстве рассматриваются различные способы взаимодействия с Redis из приложения Node.js с использованием библиотеки node_redis
.
Установка node_redis
node_redis
, как вы уже догадались, является клиентом Redis для Node.js. Вы можете установить его через npm, используя следующую команду.
npm install redis
Начиная
После установки модуля node_redis
. Давайте создадим простой файл app.js
и посмотрим, как подключиться к Redis из Node.js.
app.js
var redis = require('redis'); var client = redis.createClient(); //creates a new client
По умолчанию redis.createClient()
будет использовать 127.0.0.1
и 6379
качестве имени хоста и порта соответственно. Если у вас другой хост / порт, вы можете указать их следующим образом:
var client = redis.createClient(port, host);
Теперь вы можете выполнить какое-либо действие после установления соединения. По сути, вам просто нужно прослушивать события connect
как показано ниже.
client.on('connect', function() { console.log('connected'); });
Итак, следующий фрагмент идет в app.js
:
var redis = require('redis'); var client = redis.createClient(); client.on('connect', function() { console.log('connected'); });
Теперь введите в node app
чтобы запустить приложение. Перед запуском этого фрагмента убедитесь, что ваш сервер Redis запущен и работает.
Хранение пар ключ-значение
Теперь, когда вы знаете, как подключиться к Redis из Node.js, давайте посмотрим, как хранить пары ключ-значение в хранилище Redis.
Хранение строк
Все команды Redis представлены в виде различных функций на client
объекте. Для хранения простой строки используйте следующий синтаксис:
client.set('framework', 'AngularJS');
Или
client.set(['framework', 'AngularJS']);
Вышеуказанные фрагменты хранят простую строку AngularJS
против ключевой framework
. Вы должны заметить, что оба фрагмента делают одно и то же. Единственное отличие состоит в том, что первый передает переменное число аргументов, а последний передает массив args
в client.set()
. Вы также можете передать дополнительный обратный вызов, чтобы получить уведомление о завершении операции:
client.set('framework', 'AngularJS', function(err, reply) { console.log(reply); });
Если операция по какой-то причине не удалась, аргумент err
для обратного вызова представляет ошибку. Чтобы получить значение ключа, выполните следующие действия:
client.get('framework', function(err, reply) { console.log(reply); });
client.get()
позволяет вам получить ключ, хранящийся в Redis. К значению ключа можно получить доступ через reply
аргумент обратного вызова. Если ключ не существует, значение reply
будет пустым.
Хранение хэша
Много раз хранение простых значений не решит вашу проблему. Вам нужно будет хранить хэши (объекты) в Redis. Для этого вы можете использовать hmset()
следующим образом:
client.hmset('frameworks', 'javascript', 'AngularJS', 'css', 'Bootstrap', 'node', 'Express'); client.hgetall('frameworks', function(err, object) { console.log(object); });
Приведенный выше фрагмент хранит хэш в Redis, который отображает каждую технологию в ее структуру. Первым аргументом hmset()
является имя ключа. Последующие аргументы представляют пары ключ-значение. Точно так же hgetall()
используется для получения значения ключа. Если ключ найден, второй аргумент для обратного вызова будет содержать значение, которое является объектом.
Обратите внимание, что Redis не поддерживает вложенные объекты. Все значения свойств в объекте будут переданы в строки перед сохранением.
Вы также можете использовать следующий синтаксис для хранения объектов в Redis:
client.hmset('frameworks', { 'javascript': 'AngularJS', 'css': 'Bootstrap', 'node': 'Express' });
Необязательный обратный вызов также может быть передан, чтобы знать, когда операция завершена.
Все функции (команды) могут быть вызваны с прописными / строчными эквивалентами. Например, client.hmset () и client.HMSET () одинаковы.
Хранение списков
Если вы хотите сохранить список элементов, вы можете использовать списки Redis. Для сохранения списка используйте следующий синтаксис:
client.rpush(['frameworks', 'angularjs', 'backbone'], function(err, reply) { console.log(reply); //prints 2 });
Приведенный выше фрагмент кода создает список с именем frameworks
и добавляет к нему два элемента. Итак, длина списка теперь равна двум. Как видите, я передал массив args
в rpush
. Первый элемент массива представляет имя ключа, а остальные представляют элементы списка. Вы также можете использовать lpush()
вместо rpush()
чтобы rpush()
элементы влево.
Чтобы получить элементы списка, вы можете использовать lrange()
следующим образом:
client.lrange('frameworks', 0, -1, function(err, reply) { console.log(reply); // ['angularjs', 'backbone'] });
Просто отметьте, что вы получаете все элементы списка, передавая -1 в качестве третьего аргумента lrange()
. Если вы хотите подмножество списка, вы должны передать конечный индекс здесь.
Наборы для хранения
Наборы похожи на списки, но разница в том, что они не допускают дублирования. Так что, если вы не хотите дублировать элементы в своем списке, вы можете использовать set
. Вот как мы можем изменить наш предыдущий фрагмент, чтобы использовать набор вместо списка.
client.sadd(['tags', 'angularjs', 'backbonejs', 'emberjs'], function(err, reply) { console.log(reply); // 3 });
Как видите, sadd()
создает новый set
с указанными элементами. Здесь длина набора составляет три. Чтобы получить члены набора, используйте smembers()
следующим образом:
client.smembers('tags', function(err, reply) { console.log(reply); });
Этот фрагмент извлечет всех членов набора. Просто обратите внимание, что порядок не сохраняется при получении членов.
Это был список наиболее важных структур данных, присутствующих в каждом приложении Redis. Помимо строк, списков, наборов и хэшей, вы можете хранить отсортированные наборы, hyperLogLogs и многое другое в Redis. Если вы хотите получить полный список команд и структур данных, посетите официальную документацию Redis. Помните, что почти каждая команда Redis предоставляется объекту client
предлагаемому модулем node_redis
.
Теперь давайте посмотрим на некоторые более важные операции, поддерживаемые node_redis
.
Проверка наличия ключей
Иногда вам может понадобиться проверить, существует ли ключ, и действовать соответствующим образом. Для этого вы можете использовать функцию exists()
как показано ниже:
client.exists('key', function(err, reply) { if (reply === 1) { console.log('exists'); } else { console.log('doesn\'t exist'); } });
Удаление и истечение срока действия ключей
Иногда вам нужно будет очистить некоторые ключи и повторно инициализировать их. Чтобы очистить ключи, вы можете использовать команду del
как показано ниже:
client.del('frameworks', function(err, reply) { console.log(reply); });
Вы также можете указать срок действия существующего ключа следующим образом:
client.set('key1', 'val1'); client.expire('key1', 30);
Приведенный выше фрагмент кода назначает время истечения 30 секунд для клавиши key1
.
Увеличение и уменьшение
Redis также поддерживает увеличение и уменьшение ключей. Для увеличения ключа используйте функцию incr()
как показано ниже:
client.set('key1', 10, function() { client.incr('key1', function(err, reply) { console.log(reply); // 11 }); });
Функция incr()
увеличивает значение ключа на 1. Если вам нужно incrby()
на другое значение, вы можете использовать incrby()
. Аналогично, для уменьшения ключа вы можете использовать такие функции, как decr()
и decrby()
.
Вывод
Мы рассмотрели основные и наиболее часто используемые операции в node_redis
. Вы можете использовать этот модуль, чтобы использовать всю мощь Redis и создавать действительно сложные приложения Node.js. С помощью этой библиотеки вы можете создать много интересных вещей, таких как сильный уровень кэширования, мощная система обмена сообщениями Pub / Sub и многое другое. Чтобы узнать больше о библиотеке, ознакомьтесь с их документацией . Надеюсь, вам понравилось читать статью. Дайте нам знать, что вы думаете в комментариях.