главная/Прогрев кэша. Пример с Redis на PHP
Прогреваем Кэш

Прогрев кэша. Пример с Redis на PHP

Прогревание кэша (cache warming или cache preloading) – это процесс заранее загрузки важных данных в кэш, чтобы при первом обращении к этим данным они уже были доступны из кэша, а не требовалось их извлекать из более медленного источника данных, например, из базы данных или файловой системы.

Это может значительно ускорить время загрузки страницы или время выполнения запроса, поскольку доступ к данным из кэша обычно намного быстрее.

Кэширование страниц

Если вы используете систему кэширования страниц, прогрев может заключаться в предварительном запросе страниц, чтобы они были сохранены в кэше.

Это можно сделать с помощью скрипта, который выполняет HTTP-запросы к этим страницам.

<?php

// Список URL-адресов для прогрева кэша
$urls = [
    'http://yourwebsite.com/page1',
    'http://yourwebsite.com/page2',
    'http://yourwebsite.com/page3',
];

// Функция для отправки GET-запроса к указанному URL
function warmUpCache($url) {
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20); // Установка таймаута в секундах

    // Отправка запроса
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Получение HTTP-кода ответа

    // Закрытие соединения
    curl_close($ch);

    // Вывод результатов
    echo "URL: $url\n";
    echo "HTTP Code: $httpCode\n";
    echo "Response Length: " . strlen($response) . "\n\n";
}

// Проход по всем URL и прогрев кэша
foreach ($urls as $url) {
    warmUpCache($url);
}

echo "Прогрев кэша завершен.\n";

Кэширование объектов

Для систем, использующих кэширование объектов с помощью таких решений, как Memcached или Redis, прогрев может заключаться в предварительной загрузке в кэш важных данных, таких как результаты часто выполняемых запросов к базе данных, конфигурационные данные или данные сессии.

<?php

// Подключение к Redis (пример)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// Предположим, у нас есть функция, которая получает данные для кэширования
function getDataForCaching(): array {
    // Здесь может быть логика получения данных, например, из базы данных
    return ['key1' => 'value1', 'key2' => 'value2'];
}

// Получаем данные для кэширования
$data = getDataForCaching();

// Прогреваем кэш, сохраняя данные в Redis
foreach ($data as $key => $value) {
    $redis->set($key, $value);
}

echo "Кэш прогрет.\n";

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

Важные моменты

  • Прогрев кэша может быть реализован как часть процесса деплоя или как регулярная задача, выполняемая по расписанию.
  • Важно определить, какие данные действительно стоит кэшировать, чтобы не занимать кэш маловажными данными.
  • Необходимо также предусмотреть механизмы инвалидации кэша, чтобы обновлять данные в кэше при их изменении.