Адаптер кешу 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]][¶ms]
Значення для заповнювачів [user]
, [:port]
, [/db-index]
та [¶ms]
опціональні.
Нижче представлені загальні параметри валідних 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.