Дата обновления перевода: 2021-05-11

Адаптер кеша Redis

See also

Эта статья объясняет как сконфигурировать адаптер Redis при использовании кэша как независимого компонента в любом php-приложении. Прочтите статью Symfony Cache configuration, если вы используете его в приложении Symfony.

Этот адаптер сохраняет значения в оперативной памяти, используя один (или больше) экземпляров `сервера Redis`_.

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

Caution

Требования: Для использования этого адаптера должен быть установлен и запущен как минимум один сервер Redis. Кроме того, этот адаптер требует совместимого расширения или библиотеки, реализующей \Redis, \RedisArray, RedisCluster, или \Predis.

Этот адаптер ожидает, что экземпляр Redis, RedisArray, RedisCluster, или Predis будет передан в качестве первого параметра. Пространство имён и время жизни кеша по умолчанию могут быть опционально переданы в качестве второго и третьего параметров:

use Symfony\Component\Cache\Adapter\RedisAdapter;

$cache = new RedisAdapter(

    // объект, который хранит валидное соединение с вашей системой Redis
    \Redis $redisConnection,

    // строка-префикс кключам объектов, хранящихся в этом кеше
    $namespace = '',

    // время жизни по умолчанию (в секундах) для обїектов кеша, которіе не определяют
    // собственное время жизни, со значением 0, что приводит к бесконечному хранению обїектов
    // (т.е. пока не будет вызван until RedisAdapter::clear() или не будет очищен сервер(ы))
    $defaultLifetime = 0
);

Сконфигурируйте соединение

Метод хелпера createConnection() позволяе создание и конфигурацию экземпляра класса клиента Redis используя Имя источника данных (DSN):

use Symfony\Component\Cache\Adapter\RedisAdapter;

// передайте одну строку DSN, чтобы зарегистрировать в клиенте один сервер
$client = RedisAdapter::createConnection(
    'redis://localhost'
);

DSN может указываь либо IP/хост (и необязательный порт), либо путь сокета, а также пароль и оглавление DB. Для того, чтобы включить TLS для соединений, схема redis должна быть заменена на rediss (вторая s означает “безопасная”).

Note

Имя источника данных (DSN) для этого адаптера должно использовать следующий формат.

1
redis://[user:[email protected]][ip|host|socket[:port]][/db-index]

Ниже представлены общие примеры валидных DSN, демонстрирующие комбинацию доступных значений:

use Symfony\Component\Cache\Adapter\RedisAdapter;

// хост "my.server.com" и порт "6379"
RedisAdapter::createConnection('redis://my.server.com:6379');

// хост "my.server.com" и порт "6379" and database index "20"
RedisAdapter::createConnection('redis://my.server.com:6379/20');

// хост "localhost" и SASL пользователь "rmf" и передать "abcdef"
RedisAdapter::createConnection('redis://rmf:[email protected]');

// сокет "/var/run/redis.sock" и SASL пользователь "user1" и передать "bad-pass"
RedisAdapter::createConnection('redis://user1:[email protected]/var/run/redis.sock');

// одна DSN может определять несколько серверов, используя следующий синтаксис:
// host[hostname-or-IP:port] (где порт необязателен). Сокеты должны заканчиваться на ':'
RedisAdapter::createConnection(
    'redis:?host[localhost]&host[localhost:6379]&host[/var/run/redis.sock:]&auth=my-password&redis_cluster=1'
);

Redis Sentinel, который предоставляет большую доступность для Redis, также поддерживается при использовании php-расширения Redis v5.2+ или библиотеки Predis library. Используйте параметр redis_sentinel, чтобы установить имя вашей группы сервисов:

RedisAdapter::createConnection(
    'redis:?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sentinel=mymaster'
);

Note

См. RedisTrait, чтобы узнать больше опций, которые вы можете передать в качестве параметров DSN.

Сконфигурируйте опции

Метод хелпера createConnection() также принимает массив опций в качестве второго аргумента. Ожидаемый формат - ассоциативный массив пар key => value, представляющих названия опций и их соответственные значения:

use Symfony\Component\Cache\Adapter\RedisAdapter;

$client = RedisAdapter::createConnection(

    // предоставьте dsn-строку
    'redis://localhost:6739',

    // ассоциативный массив опций конфигурации
    array(
        'persistent' => 0,
        'persistent_id' => null,
        'timeout' => 30,
        'read_timeout' => 0,
        'retry_interval' => 0,
     )

);

Доступные опции

class (тип: string)
Указывает возвращаемую библиотеку соединения, либо \Redis, либо \Predis\Client. Если не указана, то будет возвращена \Redis, если доступно расширение redis, и \Predis\Client в других случаях.
persistent (тип: int, по умолчанию: 0)
Включает или отключает использование персистентных соединений. Значение 0 отключает персистентные соединения, а значение 1 - включает.
persistent_id (тип: string|null, по умолчанию: null)
Указывает персистентный id строки, используемой для персистентного соединения.
read_timeout (тип: int, по умолчанию: 0)
Указывает время (в секундах), используемое при выполнение операций чтения в основном источнике сети до тайм-аута операции.
retry_interval (тип: int, по умолчанию: 0)
Указывает промежуток (в милисекундах) между попытками повторного соединения в случае, если клиент потеряет соединение с сервером.
tcp_keepalive (тип: int, по умолчанию: 0)
Указывает тайм-аут TCP-keepalive соединения (в секундах). Это требует phpredis v4 или выше и севера с включенным TCP-keepalive.
timeout (тип: int, по умолчанию: 30)
Указывает время (в секундах), используемое для подключения в серверу Redis до тайм-аута попытки соединения.

Note

При использовании библиотеки Predis доступные некоторые дополнительные опции, применимые к Predis. Прочтите документацию `Парметры соединения Predis`_, чтобы узнать больше.

Работа с тэгами

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

use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;

$client = RedisAdapter::createConnection('redis://localhost');
$cache = new RedisTagAwareAdapter($client);

Конфигурирование Redis

При использовании Redis в качестве кэша, вам нужно сконфигурировать настройки maxmemory и maxmemory-policy. Настроив maxmemory, вы ограничиваете то, сколько памяти может потреблять Redis. Если значение слишком низкое, Redis будет сбрасывать записи, которые все еще могут быть полезными и вы получите меньше пользы от своего кэша. Установив maxmemory-policy как allkeys-lru, вы сообщаете Redis, что можно сбрасывать данные, если у него заканчивается память, и что в первую очередь стоит сбрасывать самые старые записи (использованные давнее всего). Если вы не позволите Redis сбрасывать записи, он вернет ошибку, когда вы будете пытаться добавлять данные, если не будет доступной памяти. Пример настройки может выглядеть следующим образом:

1
2
maxmemory 100mb
maxmemory-policy allkeys-lru

Прочтите больше по этой теме в официальной `Документации кэша Redis LRU`_.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.