Адаптер кешу Redis
Дата оновлення перекладу 2025-07-25
Адаптер кешу Redis
See also
Ця стаття пояснює, як сконфігурувати адаптер Redis при використанні кешу як незалежного компонента в будь-якому PHP-додатку. Прочитайте статтю Конфігурація Symfony Cache , якщо ви використовуєте його в додатку Symfony.
Цей адаптер зберігає значення в оперативній пам'яті, використовуючи один (або більше) екземплярів сервера Redis сервера Valkey.
На відміну від адаптера APCu, та схоже з адаптером Memcached, він не обмежений загальною пам'ятю поточного серверу; ви можете зберігати зміст незалежно від вашого PHP-середовища. Можливість використовувати кластер серверів для надання надмірності або відновлення після відмови також доступна.
Warning
Вимоги: Для використання цього адаптеру має бути встановлений та запущений як
мінімум один сервер 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 16 17 18 19 20 21
use Symfony\Component\Cache\Adapter\RedisAdapter;
$cache = new RedisAdapter(
// об'єкт, який зберігає валідне з'єднання з вашою системою Redis
\Redis $redisConnection,
// рядок-префікс до ключів об'єктів, що зберігаються в цьому кеші
$namespace = '',
// час життя за замовчуванням (в секундах) для об'єктів кешу, які не визначають
// власний час життя, зі значенням 0, що призводить до нескінченного зберігання об'єктів
// (тобто, поки не буде викликано until RedisAdapter::clear() або не буде очищено сервер(и))
$defaultLifetime = 0
// $marshaller (опціонально) Екземпляр MarshallerInterface для контролювання серіалізації та
// десеріалізації обʼєктів кешу. За замовчуванням використовується нативна серіалізація PHP.
// Це може бути корисним для стискання даних, застосування користувацької логіки серіалізації або
// оптимізації розміру та продуктивності кешованих обʼєктів
?MarshallerInterface $marshaller = null
);
7.3
Підтримка Relay\Cluster була представлена в Symfony 7.3.
Сконфігуруйте з'єднання
Метод хелперу createConnection() дозволяє створення та конфігурацію екземпляру класу клієнта Redis з використанням Імені джерела даних (DSN):
1 2 3 4 5 6
use Symfony\Component\Cache\Adapter\RedisAdapter;
// передайте один рядок DSN, щоб зареєструвати в клієнті один сервер
$client = RedisAdapter::createConnection(
'redis://localhost'
);
7.3
Починаючи з Symfony 7.3, при використанні серверів Valkey ви можете використовувати
схему valkey[s]: замість redis[s]: у ваших DSN.
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, щоб дізнатися більше.
relay_cluster_context(тип:array, за замовчуванням:[])-
Визначає опції конфігурації, специфічні для
\Relay\Cluster. Наприклад, щоб
використати самопідписаний сертифікат для тестування у локальному середовищі:1 2 3 4 5 6 7 8 9 10 11 12 13 14
$options = [ // ... 'relay_cluster_context' => [ // ... 'stream' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, 'local_cert' => '/valkey.crt', 'local_pk' => '/valkey.key', 'cafile' => '/valkey.crt', ], ], ];
7.1
Опція sentinel_master як псевдонім redis_sentinel була представлена в
Symfony 7.1.
7.3
Опція relay_cluster_context була представлена в Symfony 7.3.
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.
Робота з маршалером
TagAwareMarshaller для кешування, заснованого на тегах
Оптимізує кешування для вилучення за тегами, дозволяючи ефективно управляти пов'язаними елементами:
1 2 3 4 5 6 7
$marshaller = new TagAwareMarshaller();
$cache = new RedisAdapter($redis, 'tagged_namespace', 3600, $marshaller);
$item = $cache->getItem('tagged_key');
$item->set(['value' => 'some_data', 'tags' => ['tag1', 'tag2']]);
$cache->save($item);
SodiumMarshaller для зашифрованого кешування
Шифрує кешовані дані за допомогою Sodium для підвищення безпеки:
1 2 3 4 5 6 7 8
$encryptionKeys = [sodium_crypto_box_keypair()];
$marshaller = new SodiumMarshaller($encryptionKeys);
$cache = new RedisAdapter($redis, 'secure_namespace', 3600, $marshaller);
$item = $cache->getItem('secure_key');
$item->set('confidential_data');
$cache->save($item);
DefaultMarshaller з серіалізацією igbinary
Використовує igbinary для швидшої та ефективнішої серіалізації, якщо це доступно:
1 2 3 4 5 6 7
$marshaller = new DefaultMarshaller(true);
$cache = new RedisAdapter($redis, 'optimized_namespace', 3600, $marshaller);
$item = $cache->getItem('optimized_key');
$item->set(['data' => 'optimized_data']);
$cache->save($item);
DefaultMarshaller з виключенням при невдачі
Викликає виключення, якщо серіалізація завершиться невдало, полегшуючи обробку помилок:
1 2 3 4 5 6 7 8 9 10 11
$marshaller = new DefaultMarshaller(false, true);
$cache = new RedisAdapter($redis, 'error_namespace', 3600, $marshaller);
try {
$item = $cache->getItem('error_key');
$item->set('data');
$cache->save($item);
} catch (\ValueError $e) {
echo 'Serialization failed: '.$e->getMessage();
}
SodiumMarshaller з ротацією ключів
Підтримує ротацію ключів, забезпечуючи безпечне розшифрування як зі старими, так і з новими ключами:
1 2 3 4 5 6 7 8
$keys = [sodium_crypto_box_keypair(), sodium_crypto_box_keypair()];
$marshaller = new SodiumMarshaller($keys);
$cache = new RedisAdapter($redis, 'rotated_namespace', 3600, $marshaller);
$item = $cache->getItem('rotated_key');
$item->set('data_to_encrypt');
$cache->save($item);