Redis jest de facto standardem w produkcyjnych wdrożeniach Magento 2. Zastępuje cache plikowy, obsługuje sesje i może działać jako backend Full Page Cache. Każdy z tych przypadków wymaga osobnej instancji lub bazy Redis z inną konfiguracją. Pokazuję jak to prawidłowo skonfigurować, dlaczego oddzielne instancje mają znaczenie i jak monitorować Redis w środowisku Magento.
Trzy zastosowania Redis w Magento 2
| Zastosowanie | Co przechowuje | Polecana baza Redis | Polityka eksmisji |
|---|---|---|---|
| Cache aplikacji | Konfiguracja, layout XML, tłumaczenia | db=0 | allkeys-lru |
| Sesje | Dane zalogowanych użytkowników, koszyki | db=1 | noeviction |
| Full Page Cache | Całe strony HTML | db=2 | allkeys-lru |
Sesje muszą mieć politykę noeviction – Redis nie może usuwać danych sesji gdy brakuje pamięci, bo to spowoduje wylogowanie użytkowników. Cache i FPC mogą być usuwane według LRU (Least Recently Used) – stracisz tylko performance, nie dane.
Konfiguracja w env.php
<?php
// app/etc/env.php
return [
'cache' => [
'frontend' => [
'default' => [
'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
'backend_options' => [
'server' => 'redis',
'port' => 6379,
'database' => 0,
'password' => '',
'compress_data' => '1',
'compression_lib' => 'gzip',
'compress_threshold' => 2048,
],
],
'page_cache' => [
'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
'backend_options' => [
'server' => 'redis',
'port' => 6379,
'database' => 2, // osobna baza dla FPC
'compress_data' => '0', // FPC nie kompresuj - szybszy odczyt
],
],
],
],
'session' => [
'save' => 'redis',
'redis' => [
'host' => 'redis',
'port' => 6379,
'password' => '',
'timeout' => 2.5,
'persistent_identifier' => '',
'database' => 1, // osobna baza dla sesji
'compression_threshold' => 2048,
'compression_lib' => 'gzip',
'log_level' => 1,
'max_concurrency' => 6,
'break_after_frontend' => 5,
'break_after_adminhtml' => 30,
'first_lifetime' => 600,
'bot_first_lifetime' => 60,
'bot_lifetime' => 7200,
'disable_locking' => 0,
'min_lifetime' => 60,
'max_lifetime' => 2592000,
],
],
];
Konfiguracja Redis – redis.conf dla Magento
# /etc/redis/redis.conf - kluczowe ustawienia dla Magento # Maksymalna pamięć - dostosuj do serwera maxmemory 2gb # Polityka eksmisji dla cache (db 0 i 2) # Dla sesji (db 1) użyj osobnej instancji Redis z noeviction maxmemory-policy allkeys-lru # Persistencja - dla cache możesz wyłączyć (szybciej) # Dla sesji zostaw włączone (AOF lub RDB) appendonly yes appendfsync everysec # Limit połączeń maxclients 1000 # Timeout dla idle connections timeout 300 # TCP keepalive tcp-keepalive 60
Osobne instancje Redis – lepsza izolacja
Zamiast jednej instancji Redis z trzema bazami, na produkcji rozważ trzy osobne procesy Redis – każdy ze swoją konfiguracją pamięci i polityką eksmisji:
# docker-compose.yml - trzy instancje Redis
services:
redis-cache:
image: redis:7-alpine
command: >
redis-server
--maxmemory 1gb
--maxmemory-policy allkeys-lru
--save ""
--appendonly no
ports:
- "6379:6379"
redis-session:
image: redis:7-alpine
command: >
redis-server
--maxmemory 512mb
--maxmemory-policy noeviction
--appendonly yes
--appendfsync everysec
ports:
- "6380:6379"
redis-fpc:
image: redis:7-alpine
command: >
redis-server
--maxmemory 2gb
--maxmemory-policy allkeys-lru
--save ""
--appendonly no
ports:
- "6381:6379"
Monitorowanie Redis w Magento
# Statystyki Redis w czasie rzeczywistym redis-cli monitor # Podgląd kluczowych metryk redis-cli info stats | grep -E "keyspace_hits|keyspace_misses|evicted_keys" # Hit rate - powinien być powyżej 90% # keyspace_hits / (keyspace_hits + keyspace_misses) * 100 # Sprawdzenie zajętości pamięci redis-cli info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio" # Lista największych kluczy redis-cli --bigkeys # Liczba kluczy w każdej bazie redis-cli info keyspace
<?php
// Własny skrypt diagnostyczny dla Magento
namespace Vendor\Module\Console;
use Magento\Framework\App\Cache\Frontend\Pool;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class RedisDiagnosticsCommand extends Command
{
public function __construct(
private Pool $cacheFrontendPool
) {
parent::__construct();
}
protected function configure(): void
{
$this->setName('vendor:redis:diagnostics')
->setDescription('Sprawdź stan Redis dla Magento');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
foreach ($this->cacheFrontendPool as $frontendId => $frontend) {
$backend = $frontend->getBackend();
if (!$backend instanceof \Cm_Cache_Backend_Redis) {
continue;
}
$output->writeln("Cache frontend: {$frontendId} ");
$stats = $backend->getStats();
$hits = $stats[\Zend_Cache::STATS_READS] ?? 0;
$misses = $stats[\Zend_Cache::STATS_MISSED_HITS] ?? 0;
$total = $hits + $misses;
$ratio = $total > 0 ? round($hits / $total * 100, 1) : 0;
$output->writeln(" Hit rate: {$ratio}% ({$hits}/{$total})");
}
return Command::SUCCESS;
}
}
Typowe problemy i rozwiązania
Sesje przepadają po restarcie Redis – wyłączona persistencja (AOF/RDB) dla instancji sesji. Włącz appendonly yes dla instancji obsługującej sesje.
Redis zajmuje coraz więcej pamięci – brak ustawionego maxmemory lub polityka noeviction na cache. Sprawdź konfigurację i ustaw właściwą politykę eksmisji dla każdej instancji.
Wysokie opóźnienia odpowiedzi – zbyt duże klucze w Redis lub duże liczby operacji KEYS (blokujące). W Magento sprawdź czy nie używasz przestarzałego Zend_Cache zamiast cm_redis.
Podsumowanie
Redis w Magento to nie tylko „włącz i zapomnij”. Prawidłowa konfiguracja trzech oddzielnych zastosowań z właściwymi politykami eksmisji, monitorowanie hit rate i reagowanie na sygnały przepełnienia pamięci – to elementy które odróżniają stabilne wdrożenie produkcyjne od instalacji która „jakoś działa”. Osobne instancje Redis dla cache i sesji to inwestycja która zwraca się przy pierwszym incydencie z masowym wylogowaniem użytkowników.
