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

Дата оновлення перекладу 2024-04-30

Адаптер кешу 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
);

Сконфігуруйте з'єднання

Метод хелперу 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
20
21
22
23
24
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" та аутентифікація "bad-pass"
RedisAdapter::createConnection('redis://bad-pass@/var/run/redis.sock');

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

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

// одне DSN також може визначати декілька серверів
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, за замовчуванням: null)
Вказує бібліотеку підключення для повернення: \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_master (тип: string, за замовчуванням: null)
Псевдонім опції redis_sentinel.
dbindex (тип: int, за замовчуванням: 0)
Вказує індекс дати бази для вибору.
failover (тип: string, за замовчуванням: none)
Вказує відмовостійкість для реалізацій кластеру. Для \RedisCluster валідними опціями є: none (за замовчуванням), error, distribute або slaves. Для \Predis\ClientInterface валідні опції - slaves або distribute.
ssl (тип: array, за замовчуванням: null)
Опції контексту SSL. Див. php.net/context.ssl, щоб дізнатися більше.

7.1

Опція `sentinel_master` як псевдонім `redis_sentinel` була представлена в Symfony 7.1.

Note

При використанні бібліотеки Predis доступні деякі додаткові опції, які можна застосувати до Predis. Прочитайте документацію Параметри з'єднання Predis, чтобы узнать больше.

Конфігурація Redis

При використанні Redis в якості кешу необхідно сконфігурувати налаштування maxmemory та maxmemory-policy. Встановивши maxmemory, ви обмежуєте обсяг пам'яті, який Redis може споживати. Якщо це значення замале, Redis відкидатиме записи, які все ще можуть бути корисними, і ви отримуватимете менше користі від вашого кешу. Встановлення maxmemory-policy як allkeys-lru вказує Redis, що можна відкидати дані, коли йому бракує пам'яті, і спочатку відкидати найстаріші записи (найменш нещодавно використані). Якщо ви не дозволите Redis відкидати записи, він повертатиме помилку, при спробі додати дані, коли пам'яті недостатньо. Приклад налаштування може виглядати наступним чином:

1
2
maxmemory 100mb
maxmemory-policy allkeys-lru

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

Для того, щоб використовувати інвалідацію, засновану на тегах, ви можете укласти свій адаптер в 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);

Note

При використанні RedisTagAwareAdapter, щоб підтримувати відносини між тегами та елементами кешу, ви повинні використовувати noeviction або volatile-* у політиці витіснення Redis maxmemory-policy.

Прочитайте більше за цією темою в офіційній Документації кешу Redis LRU.