Автор оригинала: Michael Owolabi.
В этой статье мы собираемся реализовать кэширование в приложении JS-узла JS, используя Redis, но, прежде чем мы включаем в детали реализации, давайте рассмотрим то, что такое кеширование и как он может помочь выполнению нашего приложения.
Что кэширование? Кэширование – это процесс хранения копий файлов в кэше или местоположение временного хранения, чтобы их можно было бы получить быстрее. – CloudFlare.
Теперь, когда мы понимаем, что такое кеширование, давайте рассмотрим причину кэширования
Почему мы кэш? Учитывая многие супер быстрые услуги и варианты, доступные для пользователей в Интернете сегодня, вы не хотите, чтобы ваша заявка займет слишком много времени, чтобы ответить на запросы пользователей или вы рискуете, что шанс ваших пользователей выбросить ваш сервис для конкурента и сохранить свой отскок расти вместо вашего дохода. Ниже приведены некоторые из причин, по которым мы кэш:
- Сохранить стоимость. Например, платить за пропускную способность или даже объем данных, отправленных по сети.
- Чтобы уменьшить время отклика приложений.
В целом, кэширование сделано правильным способом повысить производительность нашего применения и привести к беспроигрышной ситуации для нас и наших пользователей.
Предпосылки Для выполнения этого учебника вы должны иметь следующее установленное на вашем компьютере
Node JS NPM Postman/Web Browser Code Editor (VsCode)
Если у вас нет Node.js установлено, просто отправляйтесь на официальный Node.js Сайт для получения копии Node.js для вашей платформы. После установки Node.js вы автоматически установите NPM.
Начало работы, чтобы начать работу, создать новый каталог для приложения, запустив следующую команду на терминале:
cd desktop && mkdir node-caching && cd node-caching
Команды выше CD Desktop – Перейдите к каталогу на рабочем столе
MKDIR узел кэширования – Создать новый каталог с именем «Узел-кэширование»
CD Узел кэширования – Перейдите к вновь созданному каталогу узла кэширования
Инициализировать каталог, чтобы создать файл package.json by
npm init -y
Установить зависимости Для этого проекта мы будем использовать Redis, Axios и Express Framework для Node.js, поэтому давайте установим их, выполнив следующее:
npm install express redis axios
Откройте вновь созданную папку в вашем редакторе выбора.
Структура вашей папки теперь должна выглядеть следующим ниже:
Создайте простой экспресс-сервер, как показано ниже:
const express = require('express'); const app = express(); const port = 3000; app.listen(port, () => { console.log(`Server running on port ${port}`); }); module.exports = app;
Мы собираемся сделать запрос на публичном API для различных продуктов питания, предоставленные http://www.recipepuppy.com.
В файле index.js вставьте следующий код:
const express = require('express'); const app = express(); const port = 3000; const axios = require('axios'); app.get('/recipe/:fooditem', async (req, res) => { try { const fooditem = req.params.fooditem; const recipe = await axios.get(`http://www.recipepuppy.com/api/?q=${fooditem}`); return res.status(200).send({ error: false, data: recipe.data.results }); } catch (error) { console.log(error) } }); app.listen(port, () => { console.log(`Server running on port ${port}`); }); module.exports = app;
Запустите сервер, запустив узел index.js и откройте почтальон, чтобы сделать запрос на конечную точку рецепта
Как мы видим, запрос завершен в 615 мс который довольно много времени для получения данных, которые не меняются часто меняются. Мы улучшим это путем внедрения кэширования с использованием Redis.
Чтобы иметь возможность воспользоваться преимуществами предложения Redis, нам нужно получить Redis, составлением его непосредственно из источника. Для этого любезно запустите следующую команду на вашем терминале:
wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make
Подтвердите установку бегущей
make test
Затем вы можете скопировать Redis на свой путь, запустив
sudo make install
Чтобы подтвердить, что Redis правильно настроен, запустите сервер REDIS, запустив:
redis-server
от вашего терминала. Затем откройте новый клеммный вкладки/окно и запустите:
redis-cli ping
Вы должны получить Понг назад как ответ.
Для получения подробной настройки инструкции посетите официальное руководство на сайте здесь https://dedis.io/topics/quickstart.
Теперь, когда мы правильно настроены Redis, следующее – использовать его в нашем приложении, чтобы улучшить его, уменьшая поворот вокруг времени запроса и ответа.
Добавьте следующие изменения в файл index.js
const express = require('express'); const axios = require('axios'); const redis = require('redis'); const app = express(); const port = 3000; // make a connection to the local instance of redis const client = redis.createClient(6379); client.on("error", (error) => { console.error(error); }); app.get('/recipe/:fooditem', (req, res) => { try { const foodItem = req.params.fooditem; // Check the redis store for the data first client.get(foodItem, async (err, recipe) => { if (recipe) { return res.status(200).send({ error: false, message: `Recipe for ${foodItem} from the cache`, data: JSON.parse(recipe) }) } else { // When the data is not found in the cache then we can make request to the server const recipe = await axios.get(`http://www.recipepuppy.com/api/?q=${foodItem}`); // save the record in the cache for subsequent request client.setex(foodItem, 1440, JSON.stringify(recipe.data.results)); // return the result to the client return res.status(200).send({ error: false, message: `Recipe for ${foodItem} from the server`, data: recipe.data.results }); } }) } catch (error) { console.log(error) } }); app.listen(port, () => { console.log(`Server running on port ${port}`); }); module.exports = app;
Объясняя процесс кэша
Сначала мы создали клиент Redis и свяжите его с помощью локального экземпляра Redis, используя порт Redis по умолчанию ( 6379 )
const client = redis.createClient(6379);
Тогда в /Рецепт Обработчик маршрута, мы пытались получить соответствующие согласованные данные для обслуживания запроса, проверяя ключ в нашем магазине Redis. Если найдено, результат подается для запрашивающего клиента из нашего кеша, а затем нам не нужно сделать запрос сервера больше.
// Check the redis store for the data first client.get(foodItem, async (err, recipe) => { if (recipe) { return res.status(200).send({ error: false, message: `Recipe for ${foodItem} from the cache`, data: JSON.parse(recipe) }) }
Но если ключ не найден в нашем магазине REDIS, запрос сделан на сервере и, и как только ответ доступен, мы храним результат, используя уникальный ключ в магазине Redis:
const recipe = await axios.get(`http://www.recipepuppy.com/api/?q=${foodItem}`); // save the record in the cache for subsequent request client.setex(foodItem, 1440, JSON.stringify(recipe.data.results));
Следовательно, последующие запросы к той же конечной точке с одним и тем же параметром всегда будут вытеснены из кэша, поэтому кэшированные данные не истекли. Метод Setex клиента Redis используется для установки клавиши для удержания строкового значения в магазине для определенного количества секунд, которые в этом случае – 1440 (24 минуты). Полный список доступных команд и опций Redis можно найти здесь: https://dedis.io/commands.
Тестирование приложения
Теперь давайте проверим приложение после внедрения кэша. Откройте почтальон и сделайте запрос на ту же конечную точку, как и раньше.
Опять же, потому что ключ не найден в кэше, запрос отправляется на сервер, который занимает 566 мс завершить. Поскольку ключ не существовал в кэше раньше, теперь он сохраняется в кэше, и последующие запросы с теми же данными будут выявлены из кэша, что делает его быстрее, а также уменьшает нагрузку на сервер. Ниже приведено время отклика после кэша:
Как мы видим выше, это взяло пылающий 3 мс для запроса, который будет завершен, потому что он был доставлен из кэша.
Теперь скажи мне, не хочешь уже начать кэшировать?
Пожалуйста, обратите внимание, что это всего лишь верхушка айсберга того, что мы можем сделать с Redis, и я рекомендую вам проконсультироваться с официальной документацией https://dedis.io/documentation Чтобы насладиться полными возможностями этого удивительного хранилища данных.
Полный код можно найти здесь https://github.com/imichaelowolabi/node-redis-caching-tut.