Мы надеемся, что вам понравится ваше времяпрепровождение в суперинтенсивном краткосрочном курсе по Node.js.
Вы узнаете, как использовать Redis в Node.js с помощью комбинации просмотра видеороликов и чтения текстовых уроков в этом учебном курсе. Вы также получите возможность получить практический опыт, участвуя в некоторых дополнительных семинарах, в которых вы будете расширять функциональность существующего приложения Node.js.
Цели обучения
Вы изучите следующие темы, следуя материалам предоставленными в этом курсе:
- Что такое Redis и где его можно найти.
- Преимущества использования Redis, а также когда и как его использовать в вашем стеке.
- Как использовать Redis в рамках современного Node.js
- Express с помощью клиента ioredis.
- Навигация и управление экземпляром Redis с помощью программы
RedisInsight
- Хеши Redis используются для моделирования доменных объектов, а RediSearch используется для запросов к ним.
- Использование модуля RedisJSON для хранения данных документов и выполнения запросов к этим данным.
- Redis Streams обеспечивает асинхронный обмен сообщениями, а также быстрое потребление данных.
- Увеличение скорости отклика за счет кэширования данных в Redis и использования Express в качестве промежуточного ПО
- Масштабируемость вашего приложения может быть улучшена за счет использования Redis в качестве Express для хранения сессий.
Необходимое программное обеспечение
Вам понадобится компьютер, способный запускать приложения Node.js, а также Docker, так как мы будем использовать контейнер, содержащий Redis и необходимые дополнительные модули для этого курса. Этот курс предполагает, что у вас есть доступ к компьютеру, который может выполнять программы Node.js.
Для того чтобы ваша система функционировала должным образом, вам потребуется установить следующее:
- Docker (от вас потребуется команда docker-compose).
- Node.js (используйте текущую долгосрочную стабильную – LTS – версию) (используйте текущую Long Term Stable – LTS – версию)
- Инструменты для командной строки git
- Ваша любимая IDE (хотя мы рекомендуем VSCode, вы можете использовать любой редактор наиболее привычен для вас)
- Postman пригодится, когда мы будем делать некоторые вызовы API, поскольку он упрощает этот процесс.
Redis – это сервер структур данных, доступный по лицензии с открытым исходным кодом. Он классифицируется как хранилище ключей/значений, которое является подмножеством семейства баз данных NoSQL. На сайте значениями ключей могут быть любые из поддерживаемых в Redis типов данных; сами ключи являются единственными в своем роде идентификаторами. Строки являются самыми основными из этих типов данных, но к ним также относятся также включают связанные списки, множества и даже потоки. Каждый тип данных поставляется со своим собственным уникальной коллекцией моделей поведения и инструкций, которые могут быть применены к нему. Redis известен как база данных, которая работает очень быстро. Эта скорость достигается в результате того, что все данные хранятся и обслуживаются в памяти. а не с диска. Поскольку Redis надежен, все ваши данные будут храниться в памяти, но каждый раз, когда вы читаете из нее, она будет читаться из копии памяти, а не из оригинала. Благодаря этому Redis является отличным вариантом для программ, которым необходим доступ к данным в режиме реального времени.
Кэширование – еще один распространенный способ использования Redis, и база данных включает в себя функции, созданные специально для этого случая. Используя подключаемые модули, Redis может расширить функциональность и включить в нее дополнительные возможности. По мере прохождения учебной программы мы будем узнавать, как применить некоторые из них на практике.
Использование Redis с Node.js
Для того, чтобы подключить приложение к Redis, нам нужна клиентская библиотека Redis, которая совместимая с языком программирования, который мы используем. Ниже перечислены функции, которые выполняют клиенты Redis:
- Управлять соединениями, которые проходят туда и обратно между нашим приложением исервером Redis.
- Управлять соединениями по сети с сервером Redis, используя проводной протокол, предоставляемый Redis.
- Пожалуйста, предоставьте интерфейс прикладного программирования для конкретного языка, который может использовать наше приложение.
Существует два типичных клиента Redis для Node.js, они называются ioredis и node redis. Оба клиента предоставляют доступные API программирования, которые очень похожи друг на друга другой, заключая каждую команду Redis за функцией, которую можно вызвать из сценария Node.js. Ioredis, который имеет встроенную поддержку современных функций JavaScript, таких как Promises, будет тем инструментом, который мы используем в этом курсе.
Сейчас мы познакомимся с RedisInsight
RedisInsight – это бесплатный продукт, предлагаемый компанией Redis, который предоставляет пользователям системы управления базами данных Redis графический пользовательский интерфейс, в котором легко ориентироваться. Вы можете исследовать Redis и наблюдать за изменениями данных в режиме реального времени с помощью RedisInsight. С RedisInsight вы можете выполнять команды redis-cli, изменять данные, которые хранятся в существующих ключах, создавать новые ключи и удалять старые. RedisInsight также поддерживает некоторые общие модули Redis, и на протяжении всего этого курса мы будем использовать его для работы с модулями Redis и для просмотра данных, которые хранятся в модулях RedisJSON и RediSearch, соответственно. С помощью RedisInsight легко визуализировать даже самые сложные типы данных Redis, так как в нем доступны представления, специфичные для каждого типа данных.
Потоки Redis будут рассмотрены позже в этом курсе, поэтому предварительное изучение узнать о них будет вам очень полезно.
Процесс настройки и установки
- Получите исходный код и установите все необходимые зависимости
- Установите необходимые зависимости после клонирования репозитория курса с сайта
GitHub:
git clone https://github.com/redislabs-training/node-js-crash-course.git cd node-js-crash-course npm install
Запуск Redis (Docker)
Запуск Redis с помощью docker-compose из каталога node-js-crash-course включает в себя следующее
docker-compose up -d
Создание сети “node-js-crash-course_default” с драйвером по умолчанию
Создание rediscrashcourse … done
$ docker ps
Результат команды docker ps должен показать, запущенный контейнер, а используемый образ – “redislabs/redismod”. Redis 6, вместе с RediSearch, RedisJSON и RedisBloom, выполняются внутри этого контейнера.
Начните процесс настройки RedisInsight.
Если вы используете RedisInsight, вы можете начать с его запуска, и он должен немедленнооткрыться в вашем браузере. Если это не так, направьте браузер по адресу
http://localhost:8001.
Если вы никогда раньше не использовали RedisInsight, вам следует выбрать “У меня уже есть база данных” из выпадающего меню. Нажмите кнопку “Добавить базу данных Redis”, если у вас уже есть существующие базы данных Redis настроенные для использования с RedisInsight. На этом этапе выберите опцию “Подключиться к базе данных Redis, используя имя хоста и порт.” После внесения необходимых изменений в настройки базы данных, нажмите кнопку “Add Redis Database”.
Краткий обзор модулей Redis
Что именно представляют собой эти “Модули Redis”?
Разработчикам предоставляется возможность расширить фундаментальную функциональность Redis путем добавления дополнительных возможностей благодаря API модулям. Модули Redis это, по сути, библиотеки, которые можно программировать как на языке C, так и на других языках (включая Rust и Zig). Redis расширяется за счет использования модулей, которые могут добавлять дополнительные команды и/или структуры данных. Redis, например, может быть расширить до базы данных Timeseries или Graph с помощью установки модулей, сохраняя при этом все функции хранилища ключей/значений, для чего он был изначально разработан.
Изменение конфигурационного файла redis.conf позволяет загружать модули в сервер Redis при его первом запуске. Redis при первом запуске сервера. Дополнительная функциональность, которую предоставляет модуль может быть использована разработчиками приложений, которым нужно только вызывать команды модуля. В ближайшее время мы рассмотрим, как выполнить эту задачу с помощью клиента ioredis для Node.js.
Где вы можете найти модули?
Список всех доступных модулей можно найти на сайте redis.io. Redis разработал ряд модулей, которые улучшают Redis различными способами, и наш пример приложение будет использовать некоторые из них. Использование выкупленного контейнера Docker, который можно загрузить с сайта Docker Hub, является одним из способов начать работу с модулями Redis. Это контейнер, который вы будете использовать на протяжении всего курса, и он состоит из всех модулей, перечисленных ниже.
- RediSearch – это поисковая система, которая предлагает все доступные функции.
- RedisGraph – это надежная база данных графов, которая работает на основе языка запросов Cypher
Язык запросов
- RedisTimeSeries – база данных, хранящая временные ряды.
- RedisAI – тензорное хранилище и сервер моделей искусственного интеллекта.
- RedisJSON – плагин для Redis, предоставляющий собственный формат данных JSON.
- RedisBloom – расширение для Redis, которое, наряду с другими вероятностными структурами данных включает встроенную поддержку типов данных фильтров Bloom и Cuckoo.
- Структура для динамического выполнения кода, который может быть выполнен на Сервер Redis известен как RedisGears.
С помощью Redis Enterprise Cloud вы получаете доступ к полностью управляемой службе для запуска и развития Redis и его модулей. Зарегистрируйтесь на Redis Enterprise Cloud и получите весь набор функций бесплатного уровня, чтобы проверить, соответствует ли он вашим потребностям.
Использование модулей при создании нашего приложения
Наше приложение для социальной регистрации использует следующие модули Redis:
- RediSearch будет использоваться для индексации хэшей пользователей и местоположений,что обеспечит нам возможность поиска.
- RedisJSON – это расширение, которое предоставляет команды для хранения и обработки JSON-файлы. Мы будем использовать их для получения дополнительной информации о каждом из наших сайтов.
- И, наконец, чтобы предотвратить публикацию пользователями дубликатов отметок, мы воспользуемся экономящим место фильтром Блума, который включен в RedisBloom.
Использование RediSearch для индексирования и запросов
Если мы помним ключ, что необходимо сделать для восстановления содержимого хэша после того для хранения данных, мы сможем быстро получить эти данные. Поэтому поиск пользователя 852 – проще простого, но как нам выполнить любую из перечисленных ниже задач?
- Найдите человека, у которого в качестве адреса электронной почты указан dominik.schiffmann@example.com.
- Найти всех пользователей, которые были замечены последними в местоположении 124.
- Найти всех пользователей, у которых от тысячи до трех тысяч регистраций.
- Найти все места, которые имеют рейтинг не менее трех звезд и находятся в радиусе десяти миль от заданных широты и радиуса города.
Redis – это база данных ключ/значение. Это говорит о том, насколько хорошо ее модель данных подходит для облегчения поиска данных по ключам. Одного знания хэш-ключа недостаточно достаточно, чтобы ответить на поставленные выше вопросы; нам нужен дополнительный метод для индексирования нашиx данныx.
В прошлом это требовало добавления кода в базу данных ключей/значений, чтобы генерироватьи вручную обновлять индексы. Обработка регистраций с помощью потоков Redis. Регистрация в каком-либо месте является наиболее популярным действием, которое выполняют пользователи при использовании нашей системы. Этот компонент системы должен быть в состоянии масштабироваться самостоятельно не завися от производительности других частей. Автономное приложение Express было бы лучшим способом обработки POST-запросов для регистрации пользователей. Благодаря этому мы можем развивать его независимо от других конечных точек API, которые работают с GET-запросами. Наиболее эффективным способом сделать наш Checkin Receiver как можно быстрее, можно делегировать фактическую работу по обработке регистрации в другом сервисе. Check-ins берутся из потока и обновляются в Redis после того, как они были прочитаны службой Checkin Processor.
Check-ins считаются эфемерными данными в нашей системе, что означает, что пока мы обрабатываем каждый из них, нам нет необходимости хранить их постоянно. Также логично хранить их в той последовательности, в которой система их получила.Для нашего случая использования хранение данных о регистрации в потоке Redis является наиболее логичным. Поток функционирует как буфер между компонентами, которые генерируют данные и теми, которые потребляют. Каждому элементу в потоке Redis присваивается идентификатор временной метки, который используется для упорядочивания потока. Благодаря использованию потока различные компоненты могут функционировать с разной скоростью, не зная о действиях других компонентов. Каждый раз, когда он получает регистрацию от пользователя, Checkin Receiver просто добавляет новый элемент в поток. Тем временем Checkin Processor читает поток и, по своему усмотрению, обновляет хэши пользователя и хэши местоположения.
Также возможно читать поток Redis для того, чтобы найти элементы, которые были добавлены в течение определенного периода времени между начальным и конечным ID в потоке. Поскольку наши идентификаторы являются временные метки, это означает, что мы можем делать запросы на данные, которые были добавлены в определенный промежуток времени. Эта функция используется в компоненте API Server, и упражнение по кодированию для этого модуля даст вам возможность дополнить его более широкими возможностями. Как управлять своим успехом с помощью Redis. Мы наконец-то запустили наше приложение для регистрации, и пока что оно имело ошеломительный успех! Пользователи обожают его, и они регистрируются во всех и каждом заведениях, которые согласились принять в нем участие. В следующих модулях мы изучим, как Redis может помочь нам в управлении ростом, поскольку мы добавляем больше пользователей, обрабатываем больше регистраций и расширяем количество других сервисов, которые мы используем.
Мы рассмотрим следующее:
- Использование Redis в качестве кэширующего решения внутри приложения Express.
- Масштабирование в горизонтальном направлении за счет использования Redis в качестве хранилища сессий для Express.
- Обработка контрольных записей в больших масштабах с помощью групп потребителей Redis Streams.
- Использование вероятностных структур данных и модуля RedisBloom может предотвратить дублирования регистрации. Кэширование с использованием Redis и Express Middleware .
Мы стремимся предоставить нашим клиентам доступ к самой свежей информации о погоде для каждого из наших сайтов. В связи с этим мы заключили партнерство с фирмой, которая предлагает погодный API. Поскольку использование этого API является дозированным и подлежит ограничению по тарифу, мы должны стараться избегать отправки одних и тех же запросов снова и снова, если это возможно. Это пустая трата времени, может в конечном итоге стоить нам денег и замедлит получение ответов, которые мы предоставляем нашим потребителям. В качестве кэша здесь может быть использован Redis. Redis позволяет пользователям указать срок действия ключа, по истечении которого ключ будет удален Redis. Мы воспользуемся этой возможностью, чтобы кэшировать результаты вызовов API погоды в виде Redis Strings, сохраняя их в течение часа, чтобы обеспечить баланс между тем, чтобы пользователи видели последний прогноз погоды для определенного места и снижением нагрузки, которую на серверы поставщика API. Мы будем использовать дополнительную промежуточную функцию Express для того, чтобы определить хранится ли информация о погоде для определенного района в Redis кэше. Если это не так, то мы продолжим получать информацию от поставщика API провайдера. Использование Redis в качестве хранилища сессий при масштабировании приложения Express Мы создаем наше приложение как набор компонентов, используя Redis в качестве хранилища данных и кэша и как хранилище данных и кэш для нашей информации. Подавляющее большинство этих компонентов взаимодействуют с конечным пользователем с помощью цикла HTTP-запросов и ответов без статических данных цикла. Напротив, существуют сценарии, в которых нам необходимо переносить пользовательские данные от одного запроса к следующему. Мы можем распознавать пользователей, инструктируя приложение включать файл cookie в ответ, который отправляется обратно пользователю ответ, который отправляется обратно пользователю. Затем веб-браузер пользователя будет включать этот файл cookie во все последующие запросы, которые он получает. Затем Express может использовать куки идентификатор для запоминания предпочтений и других настроек пользователя в объекте сессии на стороне сервера.
Cookie можно сравнить с ключом, а объект сессии можно представить как значение, которому он соответствует. У нас есть возможность хранить их в памяти на нашем сервере; однако эта стратегия ограничивает нас одним экземпляром сервера, который в случае сбоя и перезапуска, приведет к потере всех данных сеанса. Мы можем расширять компоненты системы по горизонтали, добавляя дополнительные экземпляры , что стало возможным благодаря скорости, долговечности и способности Redis выступать в качестве надежного хранилища сессионных данных. Мы смогли интегрировать Redis в качестве хранилища сессий для служб Authentication и Checkin Receiver с минимальным количеством кода, используя используя пакет “connect-redis”, доступный на npm. Регистрация нескольких групп потребителей параллельно с расширенными потоками обработки. По мере того как все больше людей используют нашу программу и расширяется база пользователей, мы наблюдаем увеличение количество проходящих регистраций. Помните, что получатель регистрации – это тот, кто добавляет регистрации в поток Redis, а процессор регистрации – тот.который считывает чек-ины из этого потока. К сожалению, наш единственный и неповторимый процессор Checkin Processor испытывает трудности с тем.с количеством новых регистраций. Это указывает на растущую задержку между временем, когда регистрация регистрируется в потоке, и временем, когда ее значения отражаются в наших хэшах пользователей и местоположений. В дополнение к этому, мы не можем запустить более одного экземпляра Checkin Processor, поскольку каждый экземпляр будет использовать весь поток. Нам нужен механизм с помощью которого несколько копий одного и того же потребительского кода могут обрабатывать записи, взятые из потока скоординированным образом. Redis отслеживает, какие сообщения были переданы каким потребителям в группе, поэтому он гарантирует, что каждый потребитель получит свое собственное подмножество потока для обработки. Это позволяет параллельно обрабатывать поток множеством потребителей процессами в одно и то же время. Из-за этого наша логика обработки должна быть переосмыслена, чтобы записи потока могли обрабатываться не по порядку и чтобы мы могли предотвратить гонкуобстоятельства во время изменения хэшей пользователя и местоположения.
Node.js NPM
Модули Node.js, или пакеты, если хотите, управляются с помощью NPM, менеджера пакетов. На сайте www.npmjs.com размещены сотни бесплатных пакетов, которые пользователи могут скачать и использовать. Когда вы устанавливаете Node.js на свой компьютер, у вас также будет установлено программное обеспечение NPM установлена. NPM уже настроен для правильной работы на вашей машине.
Что именно считается пакетом?
В Node.js все необходимые файлы модулей включены в пакет. Модули – это библиотеки JavaScript, которые вы можете включить в свой проект. Запустите интерфейс командной строки, затем дайте команду NPM получить нужный пакет. Я бы хотел получить файл с меткой “upper-case”
Загрузите “upper-case”:
C:\Users\Ваше имя>npm install upper-case
Теперь вы успешно скачали и установили свой первый пакет! Пакет будет сохранен в каталоге, известном как “node modules”, который NPM сгенерирует для вас. Эта папка в конечном итоге будет включать все пакеты, которые вы установили в прошлом и будете устанавливать в будущем. Структура папок моего проекта сейчас выглядит следующим образом:
C:\Users\My Name\node_modules\upper-case
Использование пакета
После того, как пакет программ установлен, он готов к использованию.Вы должны включить пакет “upper-case” точно таким же образом, как и любой другой модуль:
var uc = require('upper-case');
События в Node.jsНа компьютере событие – это результат любого действия. Например, когда устанавливается соединение или открывается файл.Объекты Node.js имеют возможность генерировать события, например объект read stream,который генерирует события при открытии и закрытии файла.
Модуль событий
В Node.js есть встроенный модуль под названием “События”, который позволяет вам создавать, запускать и прослушивать собственные события, которые вы определяете. Используйте функцию need(), чтобы включить встроенный модуль Events в свой проект. Если вам необходим доступ к следующим функциям, создайте объект типа EventEmitter со следующими свойствами и методами. Кроме того, каждое свойство и каждый метод связанные с событием, являются экземплярами объекта EventEmitter.
var events = require('events'); var eventEmitter = new events.EventEmitter();
Экземпляр объекта EventEmitter
Используя объект EventEmitter, вы можете применять обработчики событий к своим собственным пользовательским событиям.
В следующем примере мы создали функцию, которая будет выполняться всякий раз, когда срабатывает событие “крик”.
Вы можете запустить событие с помощью функции emit().
Загрузка файлов в Node.js
Доступный модуль носит имя “Formidable”, и он отлично подходит для управления загрузкой файлов.
NPM предоставляет возможность загрузки и установки модуля Formidable:
C:\Users\Ваше имя>npm install formidable.
Вы можете использовать модуль Formidable в любом приложении, которое вы выберете после загрузки.
var formidable = require('formidable');
Node.js Send an email
С помощью модуля Nodemailer вы можете легко отправлять электронные письма с вашего компьютера.Загрузка и установка модуля Nodemailer может быть выполнена с помощью npm:
C:\Users\Ваше имя>npm install nodemailer
После загрузки модуля Nodemailer вы можете включить его в любое
var nodemailer = require('nodemailer');
Мы ценим ваше усердие в завершении курса. Теперь вы должны быть лучше использовать Redis в своих приложениях Node.js в качестве хранилища данных и кэша.