PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

Redis – trzy zastosowania, konfiguracja env.php, osobne instancje, monitoring

by Henryk Tews / wtorek, 11 stycznia 2022 / Opublikowano w Magento 2

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.

About Henryk Tews

Co możesz przeczytać następne

Podsumowanie 2025 – pipe operator, Hyvä mainstream, AI tooling obowiązkowy, 120 wpisów
Strategy w PHP – i jak Magento 2 używa go w cenach
MSI – Multi Source Inventory: algorytm doboru źródeł, własny SSA
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}