Redis для кеширования

Redis — это высокопроизводительное хранилище данных в памяти, часто используемое для кеширования. В контексте тестирования веб-приложений с Puppeteer его применение позволяет ускорять повторное выполнение сценариев, хранить промежуточные данные и управлять состоянием сессий без постоянного обращения к базе данных или внешним API.


Установка и настройка Redis

Для работы с Redis требуется его установка на локальной машине или использование Docker-контейнера:


sudo apt-get install redis-server

# Запуск Redis
redis-server

# Проверка работы
redis-cli ping
# Ответ: PONG

Для Node.js необходим клиент Redis. Наиболее популярный — ioredis:

npm install ioredis

Инициализация клиента в проекте:

const Redis = require('ioredis');
const redis = new Redis(); // по умолчанию подключается к localhost:6379

Ключевые подходы к кешированию

1. Кеширование страниц и элементов

При тестировании Puppeteer часто возникает необходимость многократно загружать одни и те же страницы. С помощью Redis можно сохранять HTML или содержимое элементов для последующего использования:

const puppeteer = require('puppeteer');

async function fetchPage(url) {
  const cached = await redis.get(url);
  if (cached) return cached;

  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: 'networkidle2' });
  const content = await page.content();

  await redis.set(url, content, 'EX', 3600); // кеш на 1 час
  await browser.close();

  return content;
}

Особенности:

  • Использование EX для автоматического истечения срока действия.
  • Кеширование на уровне HTML полезно при статических страницах или тестах без динамических элементов.

2. Кеширование API-запросов

Веб-приложения активно используют API. Для сокращения времени тестирования и снижения нагрузки на серверы можно кешировать ответы API:

async function fetchAPI(url) {
  const cached = await redis.get(url);
  if (cached) return JSON.parse(cached);

  const response = await fetch(url);
  const data = await response.json();

  await redis.set(url, JSON.stringify(data), 'EX', 300); // кеш на 5 минут
  return data;
}

Преимущества:

  • Снижение времени ожидания при повторных запросах.
  • Возможность тестировать приложение с предсказуемыми данными.

Работа с сессиями и токенами

При тестировании сайтов с аутентификацией повторное прохождение логина занимает время. Redis позволяет хранить сессионные токены или cookies:

async function saveCookies(page, userId) {
  const cookies = await page.cookies();
  await redis.set(`cookies:${userId}`, JSON.stringify(cookies), 'EX', 3600);
}

async function loadCookies(page, userId) {
  const cached = await redis.get(`cookies:${userId}`);
  if (!cached) return;

  const cookies = JSON.parse(cached);
  await page.setCookie(...cookies);
}

Особенности:

  • Можно разделять сессии для разных пользователей.
  • Redis обеспечивает быструю и централизованную загрузку cookies.

Стратегии управления кешем

  1. Time-to-live (TTL) Ключи всегда должны иметь срок жизни, чтобы избежать накопления устаревших данных.

  2. Инвалидация по событию В сложных приложениях кеш можно очищать при обновлении контента на сервере.

  3. Хранение в виде JSON Сложные объекты удобно сериализовать через JSON.stringify и десериализовать через JSON.parse.

  4. Разделение ключей по типам данных Например: page:<url>, api:<endpoint>, session:<userId> — это упрощает поиск и удаление.


Интеграция с Puppeteer в CI/CD

Redis особенно полезен в автоматизированных пайплайнах:

  • Кеширование страниц уменьшает время прохождения тестов на CI.
  • Сессии пользователей можно сохранять между разными этапами тестов.
  • API-ответы кэшируются для стабилизации результатов.

Пример использования в Jest с Puppeteer:

describe('Тесты с кешированием', () => {
  let browser;
  let page;

  beforeAll(async () => {
    browser = await puppeteer.launch();
    page = await browser.newPage();
    await loadCookies(page, 'testUser');
  });

  afterAll(async () => {
    await browser.close();
  });

  test('Загрузка страницы с кешем', async () => {
    const content = await fetchPage('https://example.com');
    expect(content).toContain('Example Domain');
    await saveCookies(page, 'testUser');
  });
});

Метрики и мониторинг

Redis предоставляет встроенные команды для мониторинга использования кеша:

redis-cli info memory
redis-cli keys '*'
redis-cli ttl <key>

В тестировании важно следить за:

  • Количеством ключей.
  • Сроком жизни данных.
  • Памятью, занимаемой кешем.

Эти данные позволяют оптимизировать стратегию кеширования и предотвращать утечки памяти в долгих тестовых сессиях.


Практические рекомендации

  • Кешировать только повторно используемые данные.
  • Использовать TTL для всех ключей.
  • Разделять типы данных для удобного управления.
  • Проверять актуальность кеша при изменениях на сервере.
  • Использовать Redis как централизованное хранилище для параллельных тестов.

Эффективное использование Redis в связке с Puppeteer позволяет ускорить тестирование, снизить нагрузку на ресурсы и сделать сценарии более стабильными и предсказуемыми.