Blog durchsuchen

Redis Teil 4 - Wie wird Redis in Shopware integriert?

ShopwareSoftware
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 dieses 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 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.

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,
        'redisAuth' => ''
      ),
    ),
  ],
],

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,
        'redisAuth' => ''
      ),
    ),
  ],
],

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 hier Meilenstein: Was bietet Shopware 6? beschrieben.

Shopware selbst bietet bislang noch keine Redis Unterstützung für Shopware 6 an, sobald diese nachgereicht wird, werden wir diesen Blogbeitrag entsprechend erweitern. Sollten Sie Shopware 6 in einem produktiven Setup mit Redis verwenden wollen (insbesondere mit mehr als einem Server), empfehlen wir vorher Rücksprache mit Shopware zu halten, um sicherzustellen, dass das Setup so stabil betrieben werden kann.

Da das unterliegende Symfony-Framework bereits eigene Cache und Session Handler für Redis mitliefert, konnten wir in einem Test allerdings erfolgreich Shopware 6 mit Redis nutzen.

Dazu haben wir folgende Dateien im Stammverzeichnis der Shopware Installation angelegt:

config/packages/framework.yaml
framework: 
    cache:
        app: cache.adapter.redis
        system: cache.adapter.redis
        pools:
            serializer:
                adapter: cache.adapter.redis
            annotations:
                adapter: cache.adapter.redis
            property_info:
                adapter: cache.adapter.redis
            messenger:
                adapter: cache.adapter.redis
            property_access:
                adapter: cache.adapter.redis
        default_redis_provider: "redis://%app.redis.cache.host%:%app.redis.cache.port%"
    session:
        handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler     
config/services.yaml
parameters:
    app.redis.cache.host: "%env(REDIS_CACHE_HOST)%"
    app.redis.cache.port: "%env(REDIS_CACHE_PORT)%"

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'

Die Sessions landeten bei unserem Test vollständig in Redis. Der Cache hingegen wurde trotz unserer Änderungen zu großen Teilen im Dateisystem abgelegt. Sobald es eine offizielle Redis Unterstützung bei Shopware 6 gibt, werden wir diesen Beitrag aktualisieren.

Anschließend haben wir die Umgebungsvariablen in der .env-Datei um die neuen Variablen erweitert:

...
REDIS_SESSION_HOST=127.0.0.1
REDIS_SESSION_PORT=6379

REDIS_CACHE_HOST=127.0.0.1
REDIS_CACHE_PORT=6380

Wir unterstützen Sie gerne

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.

Weiterführende Links

Sie haben Fragen, Wünsche, Kritik, Anregungen oder wollen uns einfach mal Ihre Meinung zu unserem Blog mitteilen? Hier haben Sie Gelegenheit, direkt mit uns in Kontakt zu treten.

E-Mail senden