Пошук уроків, статей та іншого контенту
Розгорнете Redis у контейнері та налаштуєте його використання для кешування й тимчасових даних.
Redis — це швидке сховище даних у пам’яті, яке часто використовують для:
кешування результатів обчислень або запитів;
зберігання сесій;
тимчасових токенів;
лічильників;
черг і короткоживучих даних.
Docker дає змогу запустити Redis без встановлення його безпосередньо в операційну систему. Контейнер Redis можна швидко створити, зупинити або видалити, не змінюючи конфігурацію хоста.
Для кешу Redis особливо зручний завдяки підтримці часу життя ключів — TTL. Після завершення TTL ключ автоматично видаляється.
Найпростіший спосіб запустити Redis:
docker run -d \
--name redis \
-p 6379:6379 \
redis:7-alpineПараметри команди:
-d — запуск у фоновому режимі;
--name redis — ім’я контейнера;
-p 6379:6379 — доступ до Redis через порт 6379 хоста;
redis:7-alpine — образ Redis на базі Alpine Linux.
Перевірити запущені контейнери:
docker psПеревірити стан Redis можна за допомогою redis-cli, який уже є всередині контейнера:
docker exec redis redis-cli pingОчікувана відповідь:
PONGТестовий запис і читання даних:
docker exec redis redis-cli SET test "Hello Redis"
docker exec redis redis-cli GET testРезультат:
Hello RedisВидалити тестовий ключ:
docker exec redis redis-cli DEL testЗупинити Redis:
docker stop redisЗапустити вже створений контейнер:
docker start redisВидалити контейнер:
docker rm -f redisЯкщо контейнер видалити, дані, які зберігалися лише в його пам’яті, будуть втрачені. Для кешу це зазвичай прийнятно: кеш можна створити повторно з основного сховища.
Для застосунку з кількома сервісами зручніше використовувати Docker Compose. Створіть файл compose.yaml:
services:
redis:
image: redis:7-alpine
container_name: redis
ports:
- "6379:6379"
restart: unless-stoppedЗапустіть Redis:
docker compose up -dПеревірте стан сервісів:
docker compose psЗупиніть сервіси:
docker compose downУ Compose ім’я сервісу стає його мережевим іменем. Тому інший контейнер у цьому самому Compose-проєкті має підключатися до Redis за адресою redis, а не localhost.
Наприклад:
redis://redis:6379Якщо застосунок запущений безпосередньо на хості, використовуйте:
redis://localhost:6379Redis зберігає дані у форматі ключ-значення.
Записати значення:
docker exec redis redis-cli SET user:42:name "Olena"Прочитати значення:
docker exec redis redis-cli GET user:42:nameПеревірити, чи існує ключ:
docker exec redis redis-cli EXISTS user:42:nameВидалити ключ:
docker exec redis redis-cli DEL user:42:nameДля ключів варто використовувати зрозумілу структуру. Наприклад:
user:42:name
session:abc123
cache:products:page:1
rate-limit:192.168.1.10Такий формат допомагає уникати конфліктів між різними типами даних.
TTL визначає, скільки секунд ключ має існувати.
Встановити ключ із часом життя 60 секунд:
docker exec redis redis-cli SET verification-code:42 "839201" EX 60Перевірити залишок часу:
docker exec redis redis-cli TTL verification-code:42Якщо ключ існує, команда повертає кількість секунд. Значення -1 означає, що TTL не встановлено, а -2 — що ключа вже немає.
TTL зручно використовувати для:
кодів підтвердження;
токенів скидання пароля;
кешу;
тимчасових блокувань;
ідемпотентних ключів запитів.
Приклад кешування:
docker exec redis redis-cli SET cache:weather:kyiv '{"temperature":18}' EX 300У цьому прикладі результат зберігатиметься 5 хвилин.
Для Node.js можна використати пакет redis.
Створіть окрему директорію та встановіть залежність:
mkdir redis-demo
cd redis-demo
npm init -y
npm install redisСтворіть файл app.js:
const { createClient } = require("redis");
const redisUrl = process.env.REDIS_URL || "redis://localhost:6379";
const client = createClient({
url: redisUrl,
});
client.on("error", (error) => {
console.error("Помилка Redis:", error);
});
async function main() {
await client.connect();
const cacheKey = "cache:greeting";
await client.setEx(cacheKey, 60, "Привіт із Redis!");
const value = await client.get(cacheKey);
const ttl = await client.ttl(cacheKey);
console.log("Значення:", value);
console.log("Залишок TTL:", ttl, "сек.");
await client.quit();
}
main().catch(async (error) => {
console.error("Помилка застосунку:", error);
if (client.isOpen) {
await client.quit();
}
process.exit(1);
});Запустіть Redis:
docker start redisЗапустіть застосунок:
node app.jsОчікуваний результат матиме приблизно такий вигляд:
Значення: Привіт із Redis!
Залишок TTL: 60 сек.Метод setEx одночасно записує значення та встановлює TTL. Це зменшує ризик створити ключ без терміну дії.
Один із найпоширеніших способів кешування — патерн cache-aside:
застосунок перевіряє дані в Redis;
якщо дані знайдено, повертає їх із кешу;
якщо даних немає, отримує їх з основного сховища;
записує результат у Redis із TTL;
повертає результат клієнту.
Спрощений приклад:
const { createClient } = require("redis");
const client = createClient({
url: process.env.REDIS_URL || "redis://localhost:6379",
});
client.on("error", (error) => {
console.error("Помилка Redis:", error);
});
async function loadProductFromDatabase(productId) {
// Імітація повільного запиту до основної бази даних
await new Promise((resolve) => setTimeout(resolve, 500));
return {
id: productId,
name: "Механічна клавіатура",
price: 2500,
};
}
async function getProduct(productId) {
const key = `cache:product:${productId}`;
const cachedProduct = await client.get(key);
if (cachedProduct !== null) {
console.log("Дані отримано з Redis");
return JSON.parse(cachedProduct);
}
console.log("Дані отримано з основної бази");
const product = await loadProductFromDatabase(productId);
await client.setEx(key, 300, JSON.stringify(product));
return product;
}
async function main() {
await client.connect();
const firstProduct = await getProduct(42);
console.log(firstProduct);
const secondProduct = await getProduct(42);
console.log(secondProduct);
await client.quit();
}
main().catch(async (error) => {
console.error("Помилка:", error);
if (client.isOpen) {
await client.quit();
}
process.exit(1);
});Під час першого виклику дані надходять з основного джерела й потрапляють у кеш. Під час наступного виклику застосунок читає їх із Redis.
Кеш не має бути єдиним джерелом критично важливих даних. Якщо Redis недоступний або ключ видалено, застосунок повинен уміти отримати дані з основного сховища повторно.
Якщо Node.js-застосунок також працює в Docker, сервіси можна описати в одному compose.yaml:
services:
app:
image: node:22-alpine
working_dir: /app
volumes:
- .:/app
environment:
REDIS_URL: redis://redis:6379
command: sh -c "npm install && node app.js"
depends_on:
- redis
redis:
image: redis:7-alpineЗапустіть проєкт:
docker compose upУсередині контейнера app адреса localhost вказувала б на сам контейнер застосунку. Тому для підключення до Redis використовується ім’я Compose-сервісу:
redis://redis:6379Параметр depends_on визначає порядок запуску контейнерів, але не гарантує, що Redis уже готовий приймати підключення. Застосунок має коректно обробляти помилки підключення або повторювати спробу підключення.
За замовчуванням Redis зберігає дані в пам’яті контейнера. Для кешу це типовий варіант, оскільки кеш можна відновити.
Якщо потрібно зберігати дані між перезапусками або видаленням контейнера, додайте том:
services:
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes
volumes:
redis-data:У цьому прикладі:
redis-data — іменований том Docker;
/data — каталог даних Redis у контейнері;
--appendonly yes — увімкнення журналу операцій AOF.
Для звичайного кешу персистентність часто не потрібна. Якщо Redis використовується для важливих даних, варто окремо продумати резервне копіювання, відновлення та поведінку застосунку під час втрати Redis.
Порт Redis не варто без потреби відкривати в публічну мережу. У локальній розробці можна використовувати:
ports:
- "127.0.0.1:6379:6379"Тоді Redis буде доступний лише з цього комп’ютера.
Для внутрішнього підключення контейнерів ports узагалі не обов’язковий:
services:
app:
environment:
REDIS_URL: redis://redis:6379
redis:
image: redis:7-alpineУ такій конфігурації Redis доступний застосунку через Docker-мережу, але його порт не публікується на хості.
У робочому середовищі не слід залишати Redis відкритим без автентифікації та мережевих обмежень. Паролі й інші секрети краще передавати через змінні середовища або спеціалізоване сховище секретів, а не зберігати безпосередньо у файлі Compose.
Подивитися логи Redis:
docker compose logs redisАбо для контейнера, запущеного через docker run:
docker logs redisВідкрити інтерактивну консоль Redis:
docker exec -it redis redis-cliПісля цього можна виконувати команди без повторення docker exec:
SET temporary:value "test" EX 30
GET temporary:value
TTL temporary:valueВийти з консолі:
QUITПодивитися кількість ключів у поточній базі:
docker exec redis redis-cli DBSIZEОчистити всі ключі поточної Redis-бази:
docker exec redis redis-cli FLUSHDBFLUSHDB видаляє дані без можливості звичайного відновлення, тому цю команду слід використовувати обережно.
localhost між контейнерамиУ контейнері localhost означає поточний контейнер, а не контейнер Redis.
Неправильно:
redis://localhost:6379Правильно для Compose:
redis://redis:6379Якщо кешовані ключі записувати через звичайний SET без TTL, вони можуть накопичуватися без обмеження.
Для тимчасових даних використовуйте:
SET key value EX 300або в Node.js:
await client.setEx("key", 300, "value");Дані кешу можуть зникнути після перезапуску або очищення Redis. Основні бізнес-дані потрібно зберігати в призначеному для цього постійному сховищі.
Не публікуйте порт Redis у мережу без потреби. Для локальної роботи прив’яжіть його до 127.0.0.1 або використовуйте лише внутрішню мережу Docker.
Redis може бути тимчасово недоступним під час запуску контейнерів. Застосунок має обробляти помилки підключення, а для кешу — уміти продовжувати роботу з основним джерелом даних, якщо це можливо.
Redis можна швидко запустити за допомогою образу redis:7-alpine.
Для локальної роботи використовуйте docker run або Docker Compose.
Між контейнерами Redis доступний за іменем Compose-сервісу, наприклад redis.
Для кешу та тимчасових значень встановлюйте TTL.
Патерн cache-aside передбачає перевірку кешу перед зверненням до основного сховища.
Кеш не повинен бути єдиним джерелом критично важливих даних.
Для кешу достатньо зберігання в пам’яті, а для довготривалих даних можна налаштувати том і AOF.
Не відкривайте Redis публічно без необхідності та належного захисту.