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

Дата оновлення перекладу 2022-12-11

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

See also

Ця стаття пояснює, як сконфігурувати адаптер Redis при використанні кешу як незалежного компонента в будь-якому PHP-додатку. Прочитайте статтю Конфігурація Кешу Symfony , якщо ви використовуєте його в додатку 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/хост (та необов'язковий порт), або шлях сокету, а також парль та зміст бази даних. Для того, щоб включити 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
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" та SASL користувач "rmf" та передати "abcdef"
RedisAdapter::createConnection('redis://rmf:abcdef@localhost');

// сокет "/var/run/redis.sock" та SASL користувач "user1" та передати "bad-pass"
RedisAdapter::createConnection('redis://user1:bad-pass@/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, щоб встановити ім'я вашої групи сервісів:

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'
);

// надання повноважень
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 в інших випадках. Чітко встановіть це як \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)
Вказує основне імʼя, зʼєднане з вартовими.
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, але коли Redis використовується в якості бек-енду, частіше цікавіше використовувати спеціальний RedisTagAwareAdapter. Так як логіка інвалідації тегу реалізована в самому Redis, цей адаптер надає кращу продуктивність при використанні інвалідації, заснованої на тегах:

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.