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

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

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

See also

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

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

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

Caution

Требования: Для использования этого адаптера должен быть установлен и запущен как минимум один сервер Redis. Кроме того, этот адаптер требует совместимого расширения или библиотеки, реализующей \Redis, \RedisArray, RedisCluster, или \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
);

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

Метод хелпера 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,
    ]

);

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

class (тип: string)
Указывает возвращаемую библиотеку соединения, либо \Redis, либо \Predis\Client. Если не указана, то будет возвращена \Redis, если доступно расширение redis, и \Predis\Client в других случаях. Explicitly set this to \Predis\Client for Sentinel if you are running into issues when retrieving master information.
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 (тип: bool, по умолчанию: null)
Опции контекста SSL. См. php.net/context.ssl, чтобы узнать больше.
.. note::
При использовании библиотеки Predis доступные некоторые дополнительные опции, применимые к Predis. Прочтите документацию Predis, чтобы узнать больше.

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

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

1
2
3
4
5
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 Cache Documentation.