Что такое Predis и зачем он нужен
Predis — это полнофункциональный клиент для работы с Redis (Remote Dictionary Server) на языке PHP. Redis — это высокопроизводительное хранилище данных типа «ключ-значение», которое часто используется для кэширования, управления сессиями, очередей сообщений и реального времени. Predis позволяет PHP-приложениям взаимодействовать с Redis-сервером, отправляя команды и получая ответы.
Зачем использовать Predis? В отличие от других клиентов (например, phpredis), Predis написан полностью на PHP и не требует установки дополнительных расширений C. Это делает его идеальным выбором для сред, где вы не можете контролировать установку расширений (например, на общих хостингах). Predis поддерживает все основные возможности Redis: строки, хэши, списки, множества, транзакции, Pub/Sub, кластеризацию и многое другое.
Основные сценарии использования:
- Кэширование — ускорение работы сайта за счет хранения часто запрашиваемых данных в оперативной памяти.
- Управление сессиями — хранение сессий пользователей в Redis для быстрого доступа и масштабирования.
- Очереди задач — организация фоновой обработки задач с помощью списков Redis.
- Рейтинги и счетчики — использование упорядоченных множеств для построения лидербордов.
- Pub/Sub — реализация систем обмена сообщениями в реальном времени.
Установка Predis
Predis распространяется через Composer — стандартный менеджер пакетов для PHP. Убедитесь, что у вас установлен Composer. Если нет, скачайте его с getcomposer.org.
Для установки Predis выполните команду в корне вашего проекта:
composer require predis/predis
После установки в вашем проекте появится папка vendor и файл composer.json. Для подключения Predis используйте автозагрузчик Composer:
require 'vendor/autoload.php';
Минимальные требования: PHP 7.2 или выше. Predis не требует установки расширения Redis для PHP, так как он реализует протокол Redis на чистом PHP.
Быстрый старт с примером кода
Давайте напишем простой скрипт, который подключается к Redis, сохраняет значение и читает его.
<?php
require 'vendor/autoload.php';
use Predis\Client;
// Создаем клиент Redis (по умолчанию подключается к localhost:6379)
$client = new Client();
// Устанавливаем значение
$client->set('greeting', 'Hello, Redis!');
// Получаем значение
$value = $client->get('greeting');
echo $value; // Выведет: Hello, Redis!
// Проверяем, существует ли ключ
if ($client->exists('greeting')) {
echo "Ключ существует!";
}
// Удаляем ключ
$client->del(['greeting']);
?>
Этот код делает следующее:
- Подключается к Redis-серверу на localhost (порт 6379).
- Сохраняет строку "Hello, Redis!" под ключом "greeting".
- Читает значение обратно и выводит его.
- Проверяет существование ключа.
- Удаляет ключ.
Если Redis запущен на другом хосте или порту, передайте параметры подключения:
$client = new Client([
'scheme' => 'tcp',
'host' => '192.168.1.100',
'port' => 6379,
]);
Основные методы Predis
Predis предоставляет удобный интерфейс для всех команд Redis. Рассмотрим 10 наиболее часто используемых методов с подробными примерами.
1. set — установка значения
Что делает: Устанавливает значение для указанного ключа. Если ключ уже существует, его значение перезаписывается.
Параметры:
$key(string) — имя ключа.$value(mixed) — значение (строка, число, массив будет сериализован).$expireResolution(string, опционально) — единица времени для TTL: 'EX' (секунды), 'PX' (миллисекунды).$expireTTL(int, опционально) — время жизни ключа.$flag(string, опционально) — флаг: 'NX' (установить только если ключ не существует), 'XX' (только если существует).
Пример:
<?php
$client = new Client();
// Простая установка
$client->set('user:1:name', 'Иван');
// Установка с TTL на 60 секунд
$client->set('temp_data', 'Временные данные', 'EX', 60);
// Установка только если ключ не существует
$client->set('unique_key', 'Значение', 'NX');
// Установка только если ключ существует
$client->set('existing_key', 'Новое значение', 'XX');
?>
2. get — получение значения
Что делает: Возвращает значение для указанного ключа. Если ключ не существует, возвращает null.
Параметры:
$key(string) — имя ключа.
Пример:
<?php
$client = new Client();
$client->set('name', 'Анна');
$name = $client->get('name');
echo $name; // Анна
$missing = $client->get('nonexistent');
var_dump($missing); // NULL
?>
3. exists — проверка существования ключа
Что делает: Проверяет, существует ли один или несколько ключей. Возвращает количество существующих ключей.
Параметры:
$keys(string|array) — один ключ или массив ключей.
Пример:
<?php
$client = new Client();
$client->set('key1', 'value1');
$client->set('key2', 'value2');
// Проверка одного ключа
$exists = $client->exists('key1');
echo $exists; // 1 (истина)
// Проверка нескольких ключей
$count = $client->exists(['key1', 'key2', 'key3']);
echo $count; // 2 (существуют key1 и key2)
?>
4. del — удаление ключей
Что делает: Удаляет один или несколько ключей. Возвращает количество удаленных ключей.
Параметры:
$keys(string|array) — ключ или массив ключей для удаления.
Пример:
<?php
$client = new Client();
$client->set('key1', 'value1');
$client->set('key2', 'value2');
// Удаление одного ключа
$deleted = $client->del('key1');
echo $deleted; // 1
// Удаление нескольких ключей
$deleted = $client->del(['key2', 'nonexistent']);
echo $deleted; // 1 (удален только key2)
?>
5. hset и hget — работа с хэшами
Что делает: hset устанавливает поле в хэше. hget получает значение поля из хэша. Хэши Redis идеально подходят для хранения объектов.
Параметры hset:
$key(string) — имя хэша.$field(string) — имя поля.$value(mixed) — значение поля.
Параметры hget:
$key(string) — имя хэша.$field(string) — имя поля.
Пример:
<?php
$client = new Client();
// Установка полей хэша
$client->hset('user:100', 'name', 'Мария');
$client->hset('user:100', 'email', 'maria@example.com');
$client->hset('user:100', 'age', 28);
// Получение одного поля
$name = $client->hget('user:100', 'name');
echo $name; // Мария
// Получение всех полей хэша
$all = $client->hgetall('user:100');
print_r($all);
// Array ( [name] => Мария [email] => maria@example.com [age] => 28 )
?>
6. lpush и rpop — работа со списками
Что делает: lpush добавляет элемент в начало списка. rpop извлекает и удаляет элемент с конца списка. Списки Redis часто используются для реализации очередей.
Параметры lpush:
$key(string) — имя списка.$value(mixed) — значение для добавления (можно передать несколько).
Параметры rpop:
$key(string) — имя списка.
Пример:
<?php
$client = new Client();
// Добавление задач в очередь (в начало списка)
$client->lpush('task_queue', 'task1');
$client->lpush('task_queue', 'task2');
$client->lpush('task_queue', 'task3');
// Извлечение задачи из конца списка (FIFO)
$task = $client->rpop('task_queue');
echo $task; // task1 (первая добавленная задача)
// Длина списка
$length = $client->llen('task_queue');
echo $length; // 2
?>
7. sadd и smembers — работа с множествами
Что делает: sadd добавляет один или несколько элементов в множество. smembers возвращает все элементы множества. Множества Redis хранят уникальные значения.
Параметры sadd:
$key(string) — имя множества.$members(mixed) — один или несколько элементов для добавления.
Пример:
<?php
$client = new Client();
// Добавление тегов к статье
$client->sadd('article:42:tags', 'php', 'redis', 'database');
// Попытка добавить дубликат (игнорируется)
$client->sadd('article:42:tags', 'php');
// Получение всех тегов
$tags = $client->smembers('article:42:tags');
print_r($tags);
// Array ( [0] => database [1] => php [2] => redis )
// Проверка, есть ли элемент в множестве
$isMember = $client->sismember('article:42:tags', 'php');
echo $isMember; // 1 (истина)
?>
8. zadd и zrange — работа с упорядоченными множествами
Что делает: zadd добавляет элемент с оценкой (score) в упорядоченное множество. zrange возвращает диапазон элементов по их позиции. Используется для рейтингов и лидербордов.
Параметры z