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

Дата обновления перевода: 2023-08-18

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

See also

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

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

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

Caution

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Component\Cache\Adapter\RedisAdapter;

$cache = new RedisAdapter(

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

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

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

6.3

Поддержка для Relay была представлена в Symfony 6.3.

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

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

1
2
3
4
5
6
use Symfony\Component\Cache\Adapter\RedisAdapter;

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

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

Note

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

1
redis[s]://[pass@][ip|host|socket[:port]][/db-index]
1
redis[s]:[[user]:pass@]?[ip|host|socket[:port]][&params]

Значения заполнений - [user], [:port], [/db-index] и [&params] - являются необязательными.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use Symfony\Component\Cache\Adapter\RedisAdapter;

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

// хост "my.server.com" и порт "6379" и индекс базы данных "20"
RedisAdapter::createConnection('redis://my.server.com:6379/20');

// хост "localhost", авторизация "abcdef" и тайм-аут 5 секунд
RedisAdapter::createConnection('redis://abcdef@localhost?timeout=5');

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

// хост "redis1" (контейнер docker) с альтернативным синтаксисом DSN и выбором индекса базы данных "3"
RedisAdapter::createConnection('redis:?host[redis1:6379]&dbindex=3');

// предоставление полномочий с альтернативным синтаксисом DSN
RedisAdapter::createConnection('redis:default:verysecurepassword@?host[redis1:6379]&dbindex=3');

// одна 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, чтобы установить имя вашей группы сервисов:

1
2
3
4
5
6
7
8
9
10
11
12
13
RedisAdapter::createConnection(
    'redis:?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sentinel=mymaster'
);

// providing credentials
RedisAdapter::createConnection(
    'redis:default:verysecurepassword@?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sentinel=mymaster'
);

// предоставление полномочий и выбор индекса базы данных "3"
RedisAdapter::createConnection(
    'redis:default:verysecurepassword@?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sentinel=mymaster&dbindex=3'
);

Note

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use Symfony\Component\Cache\Adapter\RedisAdapter;

$client = RedisAdapter::createConnection(

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

    // ассоциативный массив опций конфигурации
    [
        'class' => null,
        'persistent' => 0,
        'persistent_id' => null,
        'timeout' => 30,
        'read_timeout' => 0,
        'retry_interval' => 0,
        'tcp_keepalive' => 0,
        'lazy' => null,
        'redis_cluster' => false,
        'redis_sentinel' => null,
        'dbindex' => 0,
        'failover' => 'none',
        'ssl' => null,
    ]

);

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

6.3

Поддержка \Relay\Relay была представлена в Symfony 6.3.

class (тип: string)
Указывает возвращаемую библиотеку соединений, либо \Redis, либо \Relay\Relay, либо \Predis\Client. Если ни одна из них не указана, то возвращается значение в следующем порядке, в зависимости от того, какое из них доступно первым: \Redis, \Relay\Relay, \Predis\Client. Ясно установите значение \Predis\Client для Sentinel, если у вас возникают проблемы с получением основной информации.
persistent (тип: int, по умолчанию: 0)
Включает или отключает использование персистентных соединений. Значение 0 отключает персистентные соединения, а значение 1 - включает.
persistent_id (тип: string|null, по умолчанию: null)
Указывает персистентный id строки, используемой для персистентного соединения.
timeout (тип: int, по умолчанию: 30)
Указывает время (в секундах), используемое для соединения с сервером Redis, до тайм-аута попытки соединения.
read_timeout (тип: int, по умолчанию: 0)
Указывает время (в секундах), используемое при выполнение операций чтения в основном источнике сети до тайм-аута операции.
retry_interval (тип: int, по умолчанию: 0)
Указывает промежуток (в милисекундах) между попытками повторного соединения в случае, если клиент потеряет соединение с сервером.
tcp_keepalive (тип: int, по умолчанию: 0)
Указывает тайм-аут TCP-keepalive соединения (в секундах). Это требует phpredis v4 или выше и севера с включенным TCP-keepalive.
lazy (тип: bool, по умолчанию: null)
Включает или отключает ленивые соединения бэк-энда. false по умолчанию при использовании этого как отдельный компонент, и true по умолчанию, используя его внутри приложения Symfony.
redis_cluster (тип: bool, по умолчанию: false)
Включает или отключает кластер redis. Реальное переданное значение не имеет значения, если оно передаёт проверки свободного сравнения: `redis_cluster=1` будет достаточно.
redis_sentinel (тип: string, по умолчанию: null)
Указывает основное имя, связанное с sentinel.
dbindex (тип: int, по умолчанию: 0)
Указывает индекс базы данных для выбора.
failover (тип: string, по умолчанию: none)
Указывает отказоустойчивость для кластерных реализаций. Для \RedisCluster валидными опциями являются none (по умолчанию), error, distribute или slaves. Для \Predis\ClientInterface валидными опциями являются slaves или distribute.
ssl (тип: array, по умолчанию: null)
Опции контекста SSL. См. php.net/context.ssl, чтобы узнать больше.
.. note::
При использовании библиотеки Predis доступные некоторые дополнительные опции, применимые к Predis. Прочтите документацию Predis, чтобы узнать больше.

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

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

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

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

use SymfonyComponentCacheAdapterRedisAdapter; use SymfonyComponentCacheAdapterRedisTagAwareAdapter;

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

Note

При использовании RedisTagAwareAdapter для поддержания отношений между тегами и элементами кеша необходимо использовать либо noeviction, либо volatile-* в политике выселения Redis maxmemory-policy.

Прочтите больше по этой теме в официальной Redis LRU Cache Documentation.