В этой статье мы на простом примере покажем, как ускорить веб-приложения с помощью кэша Redis. Мы начнем с небольшого введения в Redis. Затем мы создадим простую серверную часть веб-приложения в Node.js для получения количества репозиториев Github для определенного имени пользователя Github. Мы будем измерять время запроса-ответа API. После этого мы внедрим ПО промежуточного слоя кэша Redis для хранения полученных данных и предоставления их пользователю, а также сравним время запроса-ответа с предыдущей реализацией без Redis.

Веб-приложения становятся все более и более сложными. Теперь они содержат много данных, которые необходимо получить из разных источников в Интернете. Эти веб-приложения, которые все больше и больше становятся клиентскими, что означает, что они выполняются в браузере клиента, должны отправлять большее количество запросов для получения, публикации и обновления ресурсов, с которыми они взаимодействуют в Интернете. Эти частые вызовы API могут сделать эти приложения очень медленными и глючными, что снижает удовлетворенность пользователей. Эту проблему можно решить с помощью Redis.

Чтобы лучше понять ситуацию, представьте, что вы торгуете финансовыми инструментами в Интернете с помощью веб-приложения, предоставленного вашим онлайн-брокером или банком. Допустим, каждые 10 секунд веб-приложение должно обновлять цену финансовых инструментов, которые вы видите перед собой. На стороне клиента вам нужна новая цена только через 10 секунд, так как у вас уже есть предыдущие цены. Таким образом, вместо отправки запросов на получение всех данных заново каждые 10 секунд, чего, кстати, не делает ни одно приложение, старые цены можно хранить в кеше с помощью Redis, а извлекаться будет только новая информация. Это может значительно повысить скорость вашего приложения, как мы увидим в этой статье.

Примечание. Торговые веб-приложения обычно используют другие системы для уведомления пользователя о новых ценах, но приведенный выше пример представляет собой вероятный вариант использования Redis.

Что такое Redis?

Redis, что означает Remote Dictionary Server, представляет собой быстрое хранилище данных с открытым исходным кодом в памяти для использования в качестве базы данных, кэша, брокера сообщений и очереди. Проект начался, когда Сальваторе Санфилиппо, первоначальный разработчик Redis, пытался улучшить масштабируемость своего итальянского стартапа. Redis теперь обеспечивает время отклика менее миллисекунды, позволяя обрабатывать миллионы запросов в секунду для приложений реального времени в играх, рекламных технологиях, финансовых услугах, здравоохранении и IoT. Redis — популярный выбор для кэширования, управления сеансами, игр, списков лидеров, аналитики в реальном времени, геопространственных данных, такси, чата/обмена сообщениями, потоковой передачи мультимедиа и приложений публикации/подписки.

Технически Redis — это база данных, которая находится в памяти компьютера, в отличие от баз данных, которые хранят данные на дисках или твердотельных накопителях. Устраняя необходимость доступа к дискам, хранилища данных в памяти, такие как Redis, позволяют избежать временных задержек при поиске и могут получать доступ к данным за микросекунды.

У Redis много преимуществ, мы упомянем самые важные из них:

  • Хранилище данных в памяти, доступ к которому намного быстрее, чем к традиционным базам данных, обычно хранящимся на диске или SSD.
  • Гибкие структуры данных: типы данных Redis включают строки, списки, наборы, хэши, растровые изображения и многое другое.
  • Простота и удобство использования за счет написания нескольких строк кода

Простое средство получения номера репозитория Github

На этом первом этапе руководства мы создадим простой API Node.js, который будем вызывать с определенным именем пользователя Github. API вернет количество репозиториев Github для конкретного имени пользователя, указанного в запросе.

Вот следующий код:

Экспресс-сервер будет прослушивать порт 5000. Корень, который мы будем вызывать, — /repos/yourgithubusername. Этот корень вызовет функцию getRepos, которая сама вызовет Github API /api.github.cim/users/yourgithubusername для получения ваших общедоступных данных. Количество общедоступных репозиториев в вашей учетной записи Github можно найти в поле public_repos объекта data. Ответ, отправленный клиенту, создается функцией setResponse, которая помещает данные в правильный формат HTML. Протестируйте свой API, например, запросив количество общедоступных репозиториев в своей учетной записи Github.

Примечание. Возможно, вам потребуется установить модули express и node-fetch .

Давайте посмотрим на время запроса-ответа нашего API. Откройте инструменты разработчика в браузере и перейдите в раздел сети. Он показывает мне время ответа на запрос 186 миллисекунд. Если вы обновляете свою страницу много раз, время запроса-ответа останется прежним. Не так уж плохо, но давайте сделаем это намного быстрее!

Добавление Redis в предыдущее веб-приложение

Давайте теперь добавим Redis в наше веб-приложение. Для этого вам необходимо установить Redis локально на свой компьютер. В MacOs вы можете легко сделать это с помощью Homebrew:

brew update
brew install redis

Чтобы запустить сервер Redis в качестве фоновой службы, вы можете использовать команду:

brew services start redis

И чтобы остановить службу, вы можете использовать:

brew services stop redis

Еще одна вещь, которую вы, возможно, захотите установить, — это модуль redis для node. Сделайте это, запустив npm install redis — домашний каталог вашего проекта.

Мы изменили код в нашем предыдущем абзаце, чтобы включить функции, связанные с Redis.

Между строками 1–8 мы импортировали и инициализировали наш клиент Redis. В строке 31 мы сохраняем количество репозиториев определенного имени пользователя в кэше Redis. В строках 41–53 мы пишем промежуточную функцию кэша Redis. Эта функция задается в качестве второго аргумента функции get в строке 55, чтобы указать, что мы хотим, чтобы эта функция cache вызывалась до функции getRepos . Что эта функция будет делать, так это проверять, сохранил ли клиент Redis, называемый client в нашем коде, что-либо, связанное с username. Если это так, то функция кеша будет напрямую отправлять клиенту ответ, содержащий количество репозиториев, хранящихся в кеше, без вызова Github API. Если ничего не сохранено, будет вызван next(), что означает, что запрос будет перенаправлен функции getRepos, которая вызовет Github API и вернет результат в браузер.

Давайте посмотрим на этот код в действии.

Первый вызов API будет иметь такое же время запроса-ответа, так как информацию нигде нельзя найти в кеше Redis. Но когда вы обновитесь, вы увидите время отклика 5 миллисекунд! Мы сделали наше приложение в 33,6 раза быстрее на известных данных! Вы также можете проверить в своей консоли, что функция getRepos не вызывалась, кроме как в первый раз, поскольку есть только одна строка журнала, говорящая Fetching Data...

Это небольшой пример, в котором мы продемонстрировали мощь Redis. В настоящее время крупные организации внедряют управление кешем с помощью Redis, что укрепляет мою уверенность в том, что Redis скоро станет новой нормой в профессиональной сфере.

Для получения дополнительной информации, связанной с разработкой веб-приложений в Node.js, ознакомьтесь с этой статьей: