В этой статье мы на простом примере покажем, как ускорить веб-приложения с помощью кэша 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, ознакомьтесь с этой статьей: