TL; DR: кеширование используется для максимально быстрого ответа пользователям. Несмотря на то, что внутреннее кеширование узла работает быстрее, чем кеш хранилища, мы должны предпочесть последнее, учитывая горизонтальное масштабирование нашего приложения и как стандарт двенадцатисфакторного приложения.
Что такое кеширование? Почему это важно?
Когда одни и те же данные запрашиваются несколькими пользователями для каждого запроса, если данные извлекаются из БД (или из любого другого стороннего API), это дорого, и концепции кеширования могут улучшить это. То есть получить данные из БД один раз и сохранить результат в структуре данных в памяти. Когда те же данные запрашиваются снова, выберите данные из памяти, а не из БД, и верните их пользователю. Это может значительно улучшить производительность.
Вы можете удалить данные из памяти, если знаете, что данные изменились или истекло заданное время.
Например, если пользователь запрашивает «доступные места для шоу», мы получаем данные из БД один раз и сохраняем их в кеше с использованием идентификатора, обычно идентификатором будет showid. А затем возвращает данные пользователю. Теперь, если кто-то еще запрашивает «доступные места для того же шоу», мы получаем данные из кеша с помощью showid и немедленно возвращаем их пользователю. Нам не нужно снова получать данные из БД. Если кто-то бронирует бронирование, мы очищаем данные в кеше, и следующий пользователь, который запросит данные, будет обслуживаться из БД с обновленными данными. И этот процесс продолжается.
Кеш узла
Мы храним часто используемые данные в памяти экземпляра узла в виде пары ключ-значение.
Таким образом, получение данных очень простое и не требует участия других процессов, кроме «кеша хранилища».
Хранить кеш
Мы храним данные извне в хранилище данных в памяти, таком как Redis.
Получение данных из кеша хранилища может включать сетевой вызов. Следовательно, он медленнее, чем механизм кэширования узлов.
Проблемы с кешем узлов
Если мы используем кеш узлов и запускаем более одного экземпляра узла, то мы можем столкнуться с частыми промахами кеша, поскольку кэшированные данные являются локальными для каждого экземпляра узла. То есть вероятность того, что запросы пользователей будут обрабатываться одним и тем же экземпляром узла, меньше. Кроме того, мы в конечном итоге сохраняем одни и те же данные в нескольких экземплярах узла, и очистка данных из всех экземпляров узла (при изменении базовых данных) становится проблемой.
Если мы запускаем только один экземпляр узла, тогда мы можем думать о кешировании узлов вместо кеширования хранилища.
Но для того, чтобы приложение узла оставалось стабильным, его следует изящно убить, когда мы сталкиваемся с ошибкой программиста. Если это произойдет, мы потеряем кешированные данные при повторном перезапуске приложения.
Кроме того, по стандарту приложение с двенадцатью факторами должно быть без сохранения состояния, что означает, что мы не храним никаких данных в экземпляре приложения узла. Это требует от нас хранения данных вне экземпляра узла.
Итак, во всех случаях мы должны использовать кеш хранилища для целей кеширования, даже если он немного медленнее, чем кеш узла. На самом деле очень мало. Redis настроен на высокую производительность.
Как использовать Redis для кеширования?
В этом разделе я подробно расскажу, как использовать Redis в качестве нашего механизма кеширования. Redis можно использовать и для других целей.
Установить Redis
Если у вас не установлен Redis, сначала установите его. Эта ссылка объясняет, как установить Redis на машину с Ubuntu. Redis сверхбыстрый. Так что не оставляйте открытый порт для публики. Так как хакеры могут попробовать много попыток ввода пароля в секунду. Пожалуйста, займитесь безопасностью как можно раньше. В той же ссылке есть шаги для этого.
Установите пакет Redis npm
Установите в свой проект Redis npm package.
npm i redis --save
Код
Пример кода для использования Redis в качестве кеша.
// Import the installed modules. const express = require('express'); const redis = require('redis'); const app = express(); // create and connect redis client to local instance. // Provide required params, if redis is configured in another machine const client = redis.createClient(); app.get('/api/:showid', (req, res) => { const showid = req.params.showid; // Try fetching the result from Redis first in case we have it cached return client.get(showid, (err, result) => { // If we have cached earlier if (result) { const resultJSON = JSON.parse(result); return res.status(200).json(resultJSON); } else { // If not, // Fetch from DB const resultFromDB = ... //Stores the result for 600secs client.setex(showid, 600, resultFromDB); } }); }); app.post('/api/book', (req, res) => { const showid = req.body.showid; //Try booking the reservation if('successfully reserved') { //Clears data from cache, when we know it is changed client.del(showid); } }); app.listen(3000, () => { console.log('Server listening on port: ', 3000); });
Ну наконец то
Redis лучше, чем кеш узлов. Если вы все еще хотите попробовать кеширование узлов, вот один пакет npm, который упростит вам жизнь.
Развлекайся.