Что такое кэширование? Как использовать Redis или Memcached?php-55

Что такое кэширование?

Кэширование — это механизм хранения часто используемых данных в быстродоступном хранилище для:

  • Ускорения работы приложения
  • Снижения нагрузки на базу данных
  • Уменьшения времени отклика
  • Экономии вычислительных ресурсов

Основные принципы:

  1. Временное хранение данных
  2. Быстрый доступ (в памяти, а не на диске)
  3. Стратегии обновления (TTL, инвалидация)

Redis vs Memcached: ключевые различия

Характеристика Redis Memcached
Тип данных Сложные (строки, хэши, списки) Только строки
Персистентность Да (можно сохранять на диск) Нет (только в памяти)
Кластеризация Поддерживается Ограниченная
Транзакции Поддерживаются Нет
Производительность Очень высокая Чуть выше для простых операций

Использование Redis в PHP

1. Установка

composer require predis/predis
# Или для расширения php-redis
sudo apt install php-redis

2. Базовые операции

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

// Запись с TTL (30 секунд)
$redis->setex('user:123', 30, json_encode(['name' => 'John']));

// Чтение
$user = $redis->get('user:123');
if ($user === false) {
    // Данных нет в кэше, получаем из БД
    $user = getUserFromDB(123);
    $redis->setex('user:123', 30, json_encode($user));
} else {
    $user = json_decode($user, true);
}

// Удаление
$redis->del('user:123');

3. Паттерны кэширования

Кэширование запросов:

$key = 'products_page_' . $page . '_' . $perPage;
if (!$products = $redis->get($key)) {
    $products = $db->query("SELECT * FROM products LIMIT ...");
    $redis->setex($key, 3600, serialize($products));
}

Кэширование фрагментов:

function getPopularProducts() {
    $redis = new Redis();
    $products = $redis->get('popular_products');
    if (!$products) {
        $products = calculatePopularProducts(); // Тяжелая операция
        $redis->setex('popular_products', 600, serialize($products));
    }
    return unserialize($products);
}

Использование Memcached в PHP

1. Установка

sudo apt install memcached php-memcached

2. Базовые операции

<?php
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);

// Запись
$memcached->set('homepage_content', $html, 3600);

// Чтение
if ($content = $memcached->get('homepage_content')) {
    echo $content;
} else {
    $content = generateHomepage();
    $memcached->set('homepage_content', $content, 3600);
    echo $content;
}

Продвинутые техники

1. Теггирование кэша

// Установка с тегами
$redis->set('product:123', $data);
$redis->sAdd('tag:products', 'product:123');

// Инвалидация по тегу
$products = $redis->sMembers('tag:products');
$redis->del(...$products);
$redis->del('tag:products');

2. Кэширование с зависимостями

$version = $redis->get('config_version');
$config = $redis->get("config:$version");
if (!$config) {
    $config = loadConfig();
    $redis->set("config:$version", $config);
}

3. Распределенный кэш

Для нескольких серверов:

$servers = [
    ['192.168.1.1', 11211, 33],
    ['192.168.1.2', 11211, 67]
];
$memcached->addServers($servers);

Лучшие практики

  1. Размер ключей: Не используйте слишком длинные ключи
  2. TTL: Всегда устанавливайте время жизни
  3. Сериализация: Используйте эффективные методы (igbinary для PHP)
  4. Мониторинг: Следите за hit/miss ratio
  5. Стратегии инвалидации: Реализуйте четкий механизм

Резюмируем:

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