sysadmin.ecommerce > bt-log-272-redis-w-ecommerce-dwie-instancje-cache-i-sesje.md
root@prod-01:~/blog# cat bt-log-272-redis-w-ecommerce-dwie-instancje-cache-i-sesje.md
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Data: 2025-08-10 | Kategoria: Bazy danych & Tuning | Czas czytania: 7 min
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Redis w e-commerce: Rozdzielenie Cache od Sesji. Jak skonfigurować dwie niezależne instancje i zapobiec czyszczeniu koszyków klientów

###02

Wielu administratorów i programistów traktuje Redisa jako uniwersalny magazyn danych efemerycznych. W typowej konfiguracji e-commerce — niezależnie czy to Magento, PrestaShop, czy WooCommerce — Redis obsługuje jednocześnie dwa krytyczne zadania:

  • Object Cache – pamięć podręczna zapytań SQL, bloków HTML i konfiguracji
  • Session Storage – dane zalogowanych użytkowników i zawartość koszyków

Uruchomienie obu funkcji w jednej instancji (port 6379) prowadzi do poważnych problemów z konwersją. W tym poradniku pokażę Ci, dlaczego tak się dzieje i jak bezpiecznie rozdzielić instancje Redisa krok po kroku.

Potrzebujesz też zoptymalizować bazę danych? Sprawdź nasz poradnik: Indeksy w MySQL – jak przyspieszyć zapytania w sklepie internetowym.

Dlaczego jedna instancja Redisa to ryzyko dla Twojego sklepu?

Problem 1: Czyszczenie cache usuwa koszyki klientów

Gdy wykonujesz FLUSHDB lub FLUSHALL (np. po zmianie cen lub wdrożeniu nowego kodu), Redis czyści całą bazę danych — w tym aktywne sesje użytkowników.

Skutek: Wszyscy klienci zostają wylogowani, a ich koszyki znikają.

Problem 2: Polityka LRU nie odróżnia cache od sesji

Przy polityce allkeys-lru, po zapełnieniu pamięci RAM Redis usuwa najdawniej używane klucze. Dla systemu klucz cache strony głównej ma taką samą wagę, jak sesja klienta, który od 15 minut kompletuje zamówienie.

Skutek: System bez ostrzeżenia usuwa sesje, uniemożliwiając finalizację transakcji.

📊 Statystyka: Według Baymard Institute, średni wskaźnik porzucania koszyków w e-commerce wynosi 70%. Problemy techniczne — jak utrata sesji — są jednym z głównych powodów.

Prawidłowa architektura: Izolacja instancji Redisa (Multi-Instance)

Na czym polega rozwiązanie?

Rozwiązaniem jest uruchomienie dwóch niezależnych procesów Redisa, z których każdy:

  • Ma własny plik konfiguracyjny
  • Pracuje na dedykowanym porcie TCP lub gnieździe UNIX
  • Stosuje inną politykę zarządzania pamięcią

Strategia konfiguracji — porównanie instancji

InstancjaPort / SocketRolaPolityka maxmemory-policyZachowanie przy braku RAM
Redis Cache6379 / .sockObject Cache, Full Page Cacheallkeys-lruAutomatycznie usuwa najstarszy cache
Redis Sessions6380 / .sockSesje i koszyki użytkownikównoevictionNigdy nie usuwa danych klientów — zwraca błąd zapisu

Jak dobrać wartości maxmemory?

Dla Cache (6379):
Przydziel 15–20% RAM-u serwera (np. 4–6 GB dla maszyny 32 GB). Cache może się bezpiecznie zapełniać — LRU automatycznie usunie najstarsze dane.

Dla Sessions (6380):
Średnia sesja w e-commerce zajmuje zaledwie 1–2 KB. Dla 10 000 użytkowników online to ~20 MB. Limit 2 GB daje margines na setki tysięcy aktywnych koszyków.

Instrukcja wdrożenia krok po kroku (Debian/Ubuntu)

Domyślna instalacja redis-server z apt tworzy jedną instancję. Skonfigurujemy teraz drugą — dedykowaną dla sesji.

Krok 1: Instalacja pakietów

sudo apt update
sudo apt install redis-server -y

Krok 2: Konfiguracja instancji Cache (Port 6379)

Edytuj domyślny plik /etc/redis/redis.conf, aby zoptymalizować go pod kątem wydajności cache:

# /etc/redis/redis.conf
port 6379
unixsocket /var/run/redis/redis-cache.sock
unixsocketperm 760

maxmemory 4gb 
maxmemory-policy allkeys-lru
dbfilename dump-cache.rdb

💡 Wskazówka: Aby serwer WWW (Nginx/Apache, user www-data) miał dostęp do gniazda UNIX, dodaj go do grupy redis:
sudo usermod -aG redis www-data

Krok 3: Konfiguracja instancji Sessions (Port 6380)

Skopiuj plik konfiguracyjny i dostosuj go:

sudo cp /etc/redis/redis.conf /etc/redis/redis-sessions.conf
sudo chown redis:redis /etc/redis/redis-sessions.conf

⚠️ Uwaga: Każda instancja musi mieć unikalny dbfilename i katalog dir, inaczej dane sesji zostaną nadpisane!

Otwórz /etc/redis/redis-sessions.conf i zmodyfikuj:

# /etc/redis/redis-sessions.conf
port 6380
pidfile /run/redis/redis-server-sessions.pid
logfile /var/log/redis/redis-server-sessions.log
dbfilename dump-sessions.rdb
dir /var/lib/redis-sessions

# Gniazdo UNIX dla maksymalnej wydajności
unixsocket /var/run/redis/redis-sessions.sock
unixsocketperm 760

# Zarządzanie pamięcią i wygasanie
maxmemory 2gb 
maxmemory-policy noeviction

Utwórz dedykowany katalog dla danych sesji:

sudo mkdir -p /var/lib/redis-sessions
sudo chown redis:redis /var/lib/redis-sessions

Krok 4: Utworzenie usługi systemd

Utwórz plik /etc/systemd/system/redis-server-sessions.service:

[Unit]
Description=Advanced Redis In-Memory Data Store for Sessions
After=network.target

[Service]
Type=forking
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
ExecStart=/usr/bin/redis-server /etc/redis/redis-sessions.conf
PIDFile=/run/redis/redis-server-sessions.pid
TimeoutStartSec=30
TimeoutStopSec=30
Restart=always

[Install]
WantedBy=multi-user.target

Krok 5: Uruchomienie obu instancji

sudo systemctl daemon-reload

# Cache (instancja domyślna)
sudo systemctl restart redis-server
sudo systemctl enable redis-server

# Sesje (nowa instancja)
sudo systemctl start redis-server-sessions
sudo systemctl enable redis-server-sessions

Krok 6: Weryfikacja poprawności działania

Sprawdź, czy obie instancje nasłuchują:

redis-cli -p 6379 PING   # Cache – powinno zwrócić PONG
redis-cli -p 6380 PING   # Sesje – powinno zwrócić PONG

Monitorowanie i reagowanie na problemy

Jak sprawdzić zużycie pamięci przez sesje?

Zaimplementuj w swoim monitoringu (Zabbix/Prometheus) komendę:

redis-cli -p 6380 INFO memory | grep used_memory_human

Przykładowy output: used_memory_human:345.12M

Co zrobić, gdy sesje przekraczają maxmemory?

1. Dynamiczne zwiększenie limitu (bez restartu):

redis-cli -p 6380 CONFIG SET maxmemory 4gb

⚠️ Pamiętaj, aby zaktualizować też plik /etc/redis/redis-sessions.conf.

2. Sprawdź czas życia sesji (TTL):

Niektóre platformy (np. Magento) same definiują TTL sesji. Upewnij się, że porzucone koszyki są prawidłowo usuwane, zamiast zalegać bez końca.

Konfiguracja dla popularnych platform e-commerce

Magento 2 — integracja przez gniazda UNIX

W pliku app/etc/env.php wskaż ścieżki do socketów zamiast portów TCP (redukuje to opóźnienia):

'session' => [
    'save' => 'redis',
    'redis' => [
        'host' => '/var/run/redis/redis-sessions.sock',
        'port' => '0',  // 0 = połączenie przez socket
    ]
],
'cache' => [
    'frontend' => [
        'default' => [
            'backend' => 'Cm_Cache_Backend_Redis',
            'backend_options' => [
                'server' => '/var/run/redis/redis-cache.sock',
                'port' => '0',
            ]
        ]
    ]
]

PrestaShop i WooCommerce

Dla tych platform konfigurację Redis podaje się zwykle przez panel administracyjny lub stałe w wp-config.php. Zamiast 127.0.0.1:6380 użyj ścieżki do socketu.

Powiązany artykuł: Jak skonfigurować Redis Cache w WooCommerce — poradnik

Skalowanie: Co dalej przy ekstremalnym ruchu?

Rozwiązanie dwuinstancyjne na jednym serwerze sprawdza się przy kilkunastu GB danych i tysiącach użytkowników online.

Gdy Twój biznes rośnie do setek tysięcy operacji na sekundę, kolejnym krokiem jest Redis Cluster — horyzontalne skalowanie z automatycznym shardingiem danych między wiele węzłów, gwarantujące wysoką dostępność (High Availability).

📘 Zainteresowany? Przeczytaj: Redis Cluster w produkcji — konfiguracja i najlepsze praktyki

FAQ — Najczęściej zadawane pytania

Czy rozdzielenie instancji Redisa zwiększa zużycie zasobów?

Sam proces Redisa zużywa tylko kilkanaście MB RAM. Całkowity narzut drugiej instancji jest znikomy w porównaniu do bezpieczeństwa danych klientów.

Czy mogę rozdzielić instancje na istniejącym, działającym sklepie?

Tak. Instrukcja powyżej zakłada dodanie drugiej instancji obok już działającej. Wystarczy przekierować zapytania sesji na nowy port/socket.

Co z backupem danych sesji?

Przy polityce noeviction i limicie 2 GB dane sesji mieszczą się w RAM. Dla dodatkowego bezpieczeństwa możesz włączyć zapis RDB (domyślnie włączony) — plik dump-sessions.rdb.

Jak sprawdzić, czy polityka noeviction działa poprawnie?

redis-cli -p 6380 CONFIG GET maxmemory-policy
# Wynik: "noeviction" – poprawnie

Podsumowanie: Dlaczego warto rozdzielić Redis Cache od Redis Sessions?

Separacja instancji Redisa to jedna z najważniejszych zasad niezawodności w e-commerce:

  • Zapobiegasz utracie koszyków przy czyszczeniu cache
  • Uniezależniasz wydajność cache od stabilności sesji
  • Koszt wdrożenia to zaledwie kilkanaście MB RAM
  • Zyskujesz pełną kontrolę nad politykami usuwania danych

Twoi klienci nigdy więcej nie stracą koszyka przy wdrożeniu nowego kodu.


Masz pytania o konfigurację? Zostaw komentarz poniżej lub sprawdź nasze pozostałe artykuły o optymalizacji e-commerce.

← Powrot do wszystkich artykulow

// alert_systemowy

Widzisz podobne symptomy na swoim serwerze e-commerce? Nie czekaj na awarię w szczycie ruchu.

→ Przejdź do formularza i zgłoś serwer do audytu zerowego