Redis клиент для PHP: Predis и PhpRedis
Redis – это высокопроизводительное хранилище данных типа «ключ-значение», работающее в оперативной памяти. Для взаимодействия с Redis из PHP существует два основных подхода: чистая PHP-библиотека Predis и нативное расширение PhpRedis. В этой статье мы подробно разберём оба инструмента, их установку, основные команды и практические примеры использования.
1. Predis – Pure PHP Redis клиент
Predis – это полностью написанная на PHP библиотека, не требующая установки дополнительных расширений. Она идеально подходит для окружений, где нет возможности компилировать C-расширения.
Установка через Composer
composer require predis/predis
Базовое подключение и примеры
require 'vendor/autoload.php';
use Predis\Client;
// Подключение по умолчанию (localhost:6379)
$redis = new Client();
// Альтернативно с явными параметрами
$redis = new Client([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'secret', // если установлен
]);
// Работа с простыми строками
$redis->set('user:1:name', 'Алексей');
echo $redis->get('user:1:name'); // Алексей
// Работа со списками
$redis->rpush('queue:tasks', 'task1', 'task2', 'task3');
$task = $redis->lpop('queue:tasks'); // task1
// Работа с хешами
$redis->hset('user:1', 'email', 'alex@example.com');
$redis->hset('user:1', 'age', 30);
$userData = $redis->hgetall('user:1');
// ['email' => 'alex@example.com', 'age' => '30']
Кэширование с TTL (время жизни)
// Сохраняем данные на 1 час (3600 секунд)
$redis->setex('weather:spb', 3600, '{"temp": 15, "humidity": 70}');
// Проверяем, существует ли ключ
if ($redis->exists('weather:spb')) {
echo $redis->get('weather:spb');
} else {
// Запрос к внешнему API и сохранение
$data = json_encode(['temp' => 15, 'humidity' => 70]);
$redis->setex('weather:spb', 3600, $data);
}
Очереди задач (списки)
// Добавляем задачу в очередь
$redis->rpush('email:queue', json_encode([
'to' => 'user@example.com',
'subject' => 'Приветствие',
'body' => 'Добро пожаловать!'
]));
// Worker: получаем задачу (блокирующий режим)
while (true) {
$taskRaw = $redis->blpop('email:queue', 5); // таймаут 5 секунд
if ($taskRaw) {
$task = json_decode($taskRaw[1], true);
sendEmail($task['to'], $task['subject'], $task['body']);
}
}
2. PhpRedis – нативное C-расширение
PhpRedis – это расширение для PHP, написанное на C. Оно работает значительно быстрее Predis за счёт минимальных накладных расходов. Требует установки через PECL или компиляции.
Установка
# Через PECL (рекомендуется)
pecl install redis
# Или вручную (Linux)
git clone https://github.com/phpredis/phpredis.git
cd phpredis
phpize
./configure
make && make install
# Добавить extension=redis.so в php.ini
Примеры использования
// Подключение
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('password'); // если пароль установлен
// Set / Get
$redis->set('counter', 1);
$redis->incr('counter');
echo $redis->get('counter'); // 2
// Работа с множествами
$redis->sadd('users:online', 'user1', 'user2', 'user3');
$onlineCount = $redis->scard('users:online'); // 3
$isOnline = $redis->sismember('users:online', 'user2'); // true
// Pub/Sub (издатель)
$redis->publish('channel:news', 'Новое сообщение!');
// Pub/Sub (подписчик – отдельный скрипт)
$redis->subscribe(['channel:news'], function ($redis, $channel, $message) {
echo "Получено из $channel: $message\n";
});
Кэширование сложных структур
// Кэшируем результат SQL-запроса
$cacheKey = 'articles:latest';
$cached = $redis->get($cacheKey);
if ($cached) {
$articles = json_decode($cached, true);
} else {
$articles = getArticlesFromDB(); // Также в библиотеке
Protocol Buffers для Java: полное руководство с примерами
Dependency Injection контейнер для Go (Golang) — wire, dig, fx
Валидация данных в Java: обзор инструментов и библиотек