Практика: настройка кеширования
В прошлом уроке вы рассмотрели паттерны кеширования по работе с данными и способы инвалидации кеша. А этот урок посвящён практике: вы научитесь настраивать паттерны для чтения — Cache-Aside, Read-Through, чтобы не заниматься настройкой базы данных.
Для реализации паттернов кеширования вы поработаете с сервисом Redis, а также Node.js как самым доступным способом запуска Redis — один из самых популярных инструментов кеширования.
Реализация Cache-Aside
- Воспользуйтесь доступным API https://restcountries.com/v3.1/all?fields=name,flags, которое возвращает имя страны и флаг.
- Зайдите на сайт https://nodejs.org и установите инструмент Node.js.
- Дальше в консоли выполните следующие команды, чтобы установить необходимые пакеты:
BASH
- И пакет для кеширования — https://github.com/node-cache/node-cache:
BASH
- Теперь можно писать код:
BASH
- Рядом создайте файл package.json:
JSX
- Запускайте и проверяйте. Для проверки можно воспользоваться утилитой Postman, которой удобно смотреть время ответа. Или сделать то же в браузере через консоль разработчика F12.
BASH
Взгляните: первый запрос http://localhost:3000/countries выполняется достаточно долго из-за большого объёма данных:
Зато следующий проходит почти моментально, потому что данные приходят из кеша.
10 ms против 546ms — это ощутимая разница.
Но сейчас данные кеша хранятся в памяти и при остановке сервиса всё очистится. Попробуем добавить Redis.
Кеширование с Redis
- Создайте в другой папке файл docker-compose.yaml:
YAML
- Запустите:
YAML
- Теперь можно скопировать предыдущий скрипт и package.json, чтобы внести в него изменения, поставить библиотеки:
YAML
- Теперь нужно исправить сам скрипт, чтобы добавить новый функционал. Он будет выглядеть вот так:
TSX
- Запуск!
BASH
Если первый запрос выполняется так же долго, то второй и последующие даже при перезапуске сервиса будут выполняться быстро.
Посмотрим вариант, как в фоне положить актуальные данные в кеш, чтобы не ждать данных при вызове.
Паттерн Refresh-Ahead
- Скопируйте последний скрипт.
- Здесь нужно установить зависимости:
BASH
- И запустить Redis, если его не было:
BASH
- Чтобы данные загружались в кеш в фоне и запросы шли только к кешу для быстрого отклика, немного подправьте скрипт. Вот так:
JSX
- Теперь, если данных нет, то приложение получит пустой ответ. Но с учётом обновления данных каждые пару секунд данные всегда будут актуальными.
Итоги
Кеширование значительно улучшает метрики и повышает пропускную способность сервиса. Главное — не забывать про его минусы и использовать кеш по назначению.
В следующем уроке вы узнаете, как поступать, когда нагрузка на приложение сильно возрастает. Для поддержания высоконагруженных приложений используются паттерны Backpressure и Curcuit — о них и пойдёт речь.