Redis Teil 4 - Wie wird Redis in Shopware integriert?

22.10.2019
extendedLogo

Redis ist ein komplexer Dienst. Für die Integration in Shopware sollten daher mehrere Vorbereitungsschritte durchgeführt werden. In diesem Blogbeitrag erklären wir schrittweise, wie Redis in Shopware integriert wird.

Redis und Shopware

In unserer Blogserie über Redis haben wir bereits die Vorteile von Redis vorgestellt. In unserem Redis Benchmark zum Anwendungscache und Benchmark zu den Sessions haben wir die Anzahl an Schreib-, Lese- und Lösch-Operationen pro Sekunde bei unterschiedlichen Backends gemessen. Damit wollten wir feststellen, welche Art der Speicherung für eine bessere Performance bei Onlineshops sorgt: die Speicherung im Arbeitsspeicher mit Redis oder im Dateisystem mit NVMe SSDs oder (beim Anwendungscache) mit memcached (Arbeitsspeicher) bzw. bei den Sessions mit MySQL.

Unsere Ergebnisse zeigten, dass Redis gegenüber der Nutzung von NVMe SSDs, memcached bzw. MySQL für mittlere bis größere Shops mit erhöhter Conversion für eine bessere Performance aufgrund des höheren Durchsatzes an Operationen pro Sekunde sorgt. Dies ist ein deutlicher Vorteil von Redis, vor allem für die Nutzer von Shopware. Standardmäßig werden bei Shopware nämlich die Sessions in der MySQL-Datenbank anstatt im Dateisystem abgelegt. Dies lässt eine wesentlich geringere Anzahl an Operationen pro Sekunde zu und ist dadurch deutlich in-perfomanter.

Shopware unterstützt Redis bereits nativ. Aus diesem Grund lassen sich ohne die Integration von Plugins Sessions, der Shopware Cache und der Doctrine Cache (Model) in Redis ablegen.

In der Enterprise Edition von Shopware wird Redis zusätzlich noch als HTTP-Cache unterstützt.

Vorbereitung der Redis Installation

Um Redis in Shopware zu integrieren, müssen verschiedene Vorbereitungsschritte unternommen werden:

Redis installieren: Bei maxcluster ist Redis bereits vorkonfiguriert und lässt sich per Mausklick in unserem Interface aktivieren. Alternativ lässt sich Redis gewöhnlich über die Paketverwaltung des Betriebssystems installieren.

Größe der Redis Instanzen anpassen: Dazu kann bei bestehenden Shops die Größe der Ordner var/sessions und var/cache zur Abschätzung verwendet werden. Insbesondere der Cache darf hier niemals voll werden, sodass wir empfehlen, die Redis Instanz so einzustellen, dass Sie maximal zu 40 % belegt ist. Bei neu entwickelten Shops ist eine Größe von 1 GB ein guter Ausgangswert. Die Größe lässt sich über die Redis Einstellung maxmemory festlegen. Bei maxcluster ist die Größe über unser Managed Center konfigurierbar.

Verdrängungstrategie ausfüllen: Für Cache und Sessions empfehlen wir die Verdrängungsstrategie volatile-lru, siehe Details dazu in Beitrag: Redis Teil 1 - Performance Optimierung für Shopware und Magento. Um diese Strategie zu nutzen, muss die maxmemory-policy-Einstellung auf volatile-lru gestellt werden.

Persistenz aktivieren: Für Sessions muss weiterhin eine Persistenz aktiviert werden, für Cache Instanzen ist diese hingegen hinderlich. Details zur Persistenz haben wir ebenfalls in Teil 1 unserer Blogserie beschrieben.

Monitoring einrichten: Für die Belegung der Redis Instanz empfehlen wir ein Monitoring einzurichten. Dazu kann man die aktuelle Belegung über das Redis Kommando "info memory" auslesen. Bei maxcluster ist ein solches Monitoring für alle als Cache markierten Instanzen automatisch aktiv.

Einfache Integration von Redis bei maxcluster

Bei maxcluster können die Redis Instanzen bequem über unser Interface erstellt werden. Um Shopware vollständig mit Redis zu nutzen, müssen 3 Instanzen angelegt werden (Sessions, Cache und Model). Für den Model Cache kann ebenfalls das Preset "Cache" verwendet werden. Da Redis mit nur einem einzelnen Thread arbeitet, ist es nicht zu empfehlen, mehrfach dieselbe Instanz zu verwenden. Ein Grund mehr, der gegen die mehrfach Verwendung derselben Instanz spricht, liegt darin, dass die Einstellungen nicht individuell angepasst werden können, sondern für eine komplette Instanz gelten.

Redis Model anlegen

Redis Model bei maxcluster anlegen

Redis im maxcluster Interface

Redis im maxcluster Interface aktivieren

Redis Konfiguration für Shopware 5

Um Redis für Shopware 5 zu konfigurieren, muss lediglich die config.php angepasst werden. Diese liegt bei der klassischen Installation direkt im Stammverzeichnis von Shopware.

Falls Shopware über Composer installiert wurde, liegt die config.php stattdessen unter app/config/config.php.

HINWEIS

Sollte Shopware 5 in Verbindung mit den Enterprise Tools verwendet werden, speichert Shopware nicht jedes Element innerhalb eines Redis Keys, sondern erstellt nur wenige Keys, wo ein Element als Unterseite hinterlegt ist.

Damit kann es bei einer zu kleinen Redis-Instanz dazu kommen, dass diese ständig voll ausgelastet ist und die Performance darunter leidet. Dies liegt daran, dass bei den Redis Eviction Policies ganze Keys entfernt werden und damit nicht nur einzelne Seiten, sondern ganze Blöcke.

Um dem entgegenzutreten, empfehlen wir die Redis Cache-Größe entsprechend zu überwachen und anzupassen. Benutzen Sie bei maxcluster dazu im Managed Center das Redis-Template "Cache", da dieses durch unser Monitoring überwacht wird.

Sessions

Um Sessions in Redis zu speichern, kann folgender Codeblock in die config.php eingefügt werden:

'session' => array(
  'save_handler' => 'redis',
  'save_path' => "tcp://127.0.0.1:6379",
),

'backendsession' => array(
  'save_handler' => 'redis',
  'save_path' => "tcp://127.0.0.1:6379",
),

Port und IP-Adresse müssen eventuell individuell angepasst werden, in unserem Beispiel handelt es sich um den Standardport von Redis. Nach der Änderung muss der Shopware Cache geleert werden.

Per SSH kann anschließend geprüft werden, ob die Integration erfolgreich war.

Dies erfolgt über den Befehl:

redis-cli -p 6379 MONITOR

Wenn sich der Redis Dienst auf demselben Server wie die Anwendung befindet, empfiehlt es sich die Anbindung über einen Socket, statt TCP durchzuführen, da TCP einen höheren Overhead hat.

'session' => array(
  'save_handler' => 'redis',
  'save_path' => "/var/run/redis/6379.sock",
),

'backendsession' => array(
  'save_handler' => 'redis',
  'save_path' => "/var/run/redis/6379.sock",
),

Redis Cache in Shopware 5

Die Integration des Caches erfolgt äquivalent zu der Session Integration mit dem folgenden Codeblock:

'cache' => [
  'backend' => 'redis', // e.G auto, apcu, xcache
  'backendOptions' => [
    'servers' => array(
      array(
        'host' => '127.0.0.1',
        'port' => 6380,
        'dbindex' => 1
      ),
    ),
  ],
],

Oder durch den Codeblock:

'cache' => [
  'backend' => 'redis', // e.G auto, apcu, xcache
  'backendOptions' => [
    'servers' => array(
      array(
        'host' => '/var/run/redis/6380.sock',
        'port' => 0,
        'dbindex' => 1
      ),
    ),
  ],
],

Model

Auch für das Model muss lediglich die config.php angepasst werden, indem folgender Codeblock eingefügt wird:

'model' => [
  'redisHost' => '127.0.0.1',
  'redisPort' => 6381,
  'redisDbIndex' => 2,
  'cacheProvider' => 'redis'
],

Oder durch den Codeblock:

'model' => [
  'redisHost' => '/var/run/redis/6381.sock',
  'redisPort' => 0,
  'redisDbIndex' => 2,
  'cacheProvider' => 'redis'
],

Redis Konfiguration in Shopware 6

Im Vergleich zu Shopware 5 hat Shopware 6 einige weitreichende Änderungen am Core durchgeführt, was sich auch die Konfiguration von Redis auswirkt. Unter anderem ist die aus Shopware 5 bekannte config.php weggefallen. Stattdessen erfolgt die Konfiguration nun über Umgebungsvariablen und die Möglichkeiten des Symfony-Frameworks. Mehr Details über Shopware 6 haben wir in dem Blogbeitrag Meilenstein: Was bietet Shopware 6? beschrieben.

Vorbereitungen

Um Redis als Cache unter Shopware 6 zu benutzen, empfehlen wir, anders als in der offiziellen Dokumentation (https://developer.shopware.com/docs/guides/hosting/performance/caches#example-replace-some-cache-with-redis) beschrieben, Redis mit Umgebungsvariablen zu konfigurieren. Dazu legen Sie entsprechend im Shopware-Stammverzeichnis innerhalb der Datei ".env" die folgenden Variablen an:

REDIS_CACHE_HOST=127.0.0.1
REDIS_CACHE_PORT=6379

Damit die Umgebungsvariablen später innerhalb des Frameworks genutzt werden können, müssen Sie diese in der Datei services.yaml definieren. Dazu im Shopware-Stammverzeichnis die Datei config/services.yaml anlegen ‒ sofern noch nicht vorhanden ‒ und die folgenden Parameter definieren:

parameters:
    app.redis.cache.host: "%env(REDIS_CACHE_HOST)%"
    app.redis.cache.port: "%env(REDIS_CACHE_PORT)%"

HTTP Cache

Soll nur der HTTP-Cache Pool in Redis genutzt werden, können Sie die folgende Konfiguration in der Datei config/packages/framework.yaml hinterlegen. Sollte die Datei noch nicht vorhanden sein, kann diese neu angelegt werden:

framework:
    cache:
        default_redis_provider: "redis://%app.redis.cache.host%:%app.redis.cache.port%"
        pools:
            cache.http:
                default_lifetime: 3600
                adapter: cache.adapter.redis
                tags: cache.tags

App Cache

Sollen alle Cache-Adapter und nicht nur der HTTP-Pool Redis benutzen, kann dies wie folgt in der Datei config/packages/framework.yaml konfiguriert werden:

framework:
    cache:
        app: cache.adapter.redis
        default_redis_provider: "redis://%app.redis.cache.host%:%app.redis.cache.port%"

Session

Shopware selbst bietet keine eigene Möglichkeit an, Sessions in Redis abzulegen und verweist auf das darunter liegende Symfony-Framework. Dazu legen wir ähnlich wie zuvor Variablen in der .env im Stammverzeichnis an:

REDIS_SESSION_HOST=127.0.0.1
REDIS_SESSION_PORT=6380

Damit diese Werte nun verwendet werden, bearbeiten wir die config/services.yaml Datei aus dem Stammverzeichnis wie folgt:

services:
    Redis:
        class: Redis
        calls:
            - method: connect
              arguments:
                  - '%env(REDIS_SESSION_HOST)%'
                  - '%env(int:REDIS_SESSION_PORT)%'
    Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
        arguments:
            - '@Redis'

Anschliessend definieren wir den Handler im Framework in der Datei config/packages/framework.yaml

framework:
    session:
        handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler

Nacharbeiten

Damit die Änderungen wirksam werden, muss der Shopware-Cache geleert werden. Dazu auf der Kommandozeile im Shopware-Stammverzeichnis den folgenden Befehl ausführen:

bin/console cache:clear

Redis-Integration bei maxcluster

Sollten Sie Unterstützung bei der Integration von Redis wünschen, bieten wir für unsere Kunden an, die Integration wie hier beschrieben für Sie durchzuführen. Kontaktieren Sie hierzu bitte unseren Support telefonisch unter 05251/41 41 30 oder via Mail an support@maxcluster.de.

Weitere Beiträge dieser Blogserie


Zuletzt aktualisiert am 09.06.2021 | JH