Кэширование — это механизм хранения часто используемых данных в быстродоступном хранилище для:
Основные принципы:
Характеристика | Redis | Memcached |
---|---|---|
Тип данных | Сложные (строки, хэши, списки) | Только строки |
Персистентность | Да (можно сохранять на диск) | Нет (только в памяти) |
Кластеризация | Поддерживается | Ограниченная |
Транзакции | Поддерживаются | Нет |
Производительность | Очень высокая | Чуть выше для простых операций |
composer require predis/predis
# Или для расширения php-redis
sudo apt install php-redis
<?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');
Кэширование запросов:
$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);
}
sudo apt install memcached php-memcached
<?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;
}
// Установка с тегами
$redis->set('product:123', $data);
$redis->sAdd('tag:products', 'product:123');
// Инвалидация по тегу
$products = $redis->sMembers('tag:products');
$redis->del(...$products);
$redis->del('tag:products');
$version = $redis->get('config_version');
$config = $redis->get("config:$version");
if (!$config) {
$config = loadConfig();
$redis->set("config:$version", $config);
}
Для нескольких серверов:
$servers = [
['192.168.1.1', 11211, 33],
['192.168.1.2', 11211, 67]
];
$memcached->addServers($servers);
Redis — более функциональное решение для сложных сценариев, Memcached — максимально простое и быстрое для базового кэширования. Выбор зависит от требований к функционалу и масштабируемости.