Configurazione della cache L2 per l’ottimizzazione delle prestazioni

La memorizzazione nella cache L2 (a due livelli) riduce il traffico di rete tra lo storage della cache remota (Redis o Valkey) e l’applicazione Commerce aggiungendo un livello di cache locale su ciascun nodo web. Un’istanza Commerce standard trasferisce circa 300 KB per richiesta e in alcune situazioni il traffico può superare rapidamente le 1000 richieste.

Con il caching L2, ogni nodo web memorizza localmente i dati a cui si accede di frequente e utilizza la cache remota per due scopi:

  • Verifica della versione dei dati della cache per verificare che la cache più recente sia memorizzata localmente
  • Trasferimento dei dati della cache aggiornati dall’archivio remoto al computer locale

Commerce memorizza la versione con hash dei dati nella cache remota, aggiungendo il suffisso :hash alla chiave regolare. Quando la cache locale non è aggiornata, i dati vengono recuperati dal computer remoto tramite un adattatore cache.

Sono disponibili due implementazioni di cache L2:

Implementazione
Versione
Descrizione
Legacy (RemoteSynchronizedCache)
2.4.x
Cache a due livelli basata su Zend con Cm_Cache_Backend_File per l’archiviazione locale
Moderno (symfony_l2)
2.4.9+
L2 basato su Symfony Cache con conformità PSR-6 e prestazioni migliorate
INFO
Per Adobe Commerce su infrastruttura cloud, puoi utilizzare distribuire variabili per la configurazione della cache L2.

Configurazione cache L2 legacy (RemoteSynchronizedCache)

Utilizzare l’esempio seguente per modificare o sostituire la sezione della cache esistente nel file app/etc/env.php.

'cache' => [
    'frontend' => [
        'default' => [
            'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
            'backend_options' => [
                'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
                'remote_backend_options' => [
                    'persistent' => 0,
                    'server' => 'localhost',
                    'database' => '0',
                    'port' => '6379',
                    'password' => '',
                    'compress_data' => '1',
                ],
                'local_backend' => 'Cm_Cache_Backend_File',
                'local_backend_options' => [
                    'cache_dir' => '/dev/shm/'
                ]
            ],
            'frontend_options' => [
                'write_control' => false,
            ],
        ]
    ],
    'type' => [
        'default' => ['frontend' => 'default'],
    ],
],

Dove:

  • backend è l’implementazione della cache L2.

  • backend_options è la configurazione della cache L2.

    • remote_backend è l’implementazione della cache remota: Redis o MySQL.
    • remote_backend_options è la configurazione della cache remota.
    • local_backend è l’implementazione della cache locale: Cm_Cache_Backend_File
    • local_backend_options è la configurazione della cache locale.
    • cache_dir è un’opzione specifica della cache del file per la directory in cui è memorizzata la cache locale.

Adobe consiglia di utilizzare Redis per il caching remoto (\Magento\Framework\Cache\Backend\Redis) e Cm_Cache_Backend_File per il caching locale dei dati nella memoria condivisa, utilizzando: 'local_backend_options' => ['cache_dir' => '/dev/shm/']

Adobe consiglia di utilizzare la funzionalità cache preload, in quanto riduce drasticamente la pressione su Redis. Non dimenticare di aggiungere il suffisso ‘:hash’ per le chiavi di precaricamento.

Opzioni cache non aggiornate

A partire da Commerce 2.4, l’opzione use_stale_cache può migliorare le prestazioni in casi specifici fornendo i dati precedentemente memorizzati nella cache mentre i nuovi dati della cache vengono generati in un processo parallelo.

In genere, il compromesso con l’attesa di blocco è accettabile dal punto di vista delle prestazioni. Tuttavia, con l’aumento del numero di blocchi o voci della cache, le attese dei blocchi richiedono più tempo. In alcuni scenari, l’attesa può essere pari a il numero di chiavi x timeout ricerca per il processo. In rari casi, un commerciante può avere centinaia di chiavi nella cache Block/Config, quindi anche un piccolo timeout di ricerca per un blocco può costare secondi.

IMPORTANT
La cache non aggiornata funziona solo con la cache L2. Per abilitarlo, aggiungere 'use_stale_cache' => true alla configurazione di livello superiore del front-end della cache L2.

Adobe consiglia di abilitare l’opzione use_stale_cache solo per i tipi di cache che ne beneficiano maggiormente, tra cui:

  • block_html
  • config_integration_api
  • config_integration
  • full_page
  • layout
  • reflection
  • translate

Adobe sconsiglia di abilitare l’opzione use_stale_cache per il tipo di cache default.

Il codice seguente mostra un esempio di configurazione:

'cache' => [
    'frontend' => [
        'default' => [
            'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
            'backend_options' => [
                'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
                'remote_backend_options' => [
                    'persistent' => 0,
                    'server' => 'localhost',
                    'database' => '0',
                    'port' => '6379',
                    'password' => '',
                    'compress_data' => '1',
                ],
                'local_backend' => 'Cm_Cache_Backend_File',
                'local_backend_options' => [
                    'cache_dir' => '/dev/shm/'
                ]
            ],
            'frontend_options' => [
                'write_control' => false,
            ],
        ],
         'stale_cache_enabled' => [
            'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
            'backend_options' => [
                'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
                'remote_backend_options' => [
                    'persistent' => 0,
                    'server' => 'localhost',
                    'database' => '0',
                    'port' => '6379',
                    'password' => '',
                    'compress_data' => '1',
                ],
                'local_backend' => 'Cm_Cache_Backend_File',
                'local_backend_options' => [
                    'cache_dir' => '/dev/shm/'
                ],
                'use_stale_cache' => true,
            ],
            'frontend_options' => [
                'write_control' => false,
            ],
        ]
    ],
    'type' => [
        'default' => ['frontend' => 'default'],
        'layout' => ['frontend' => 'stale_cache_enabled'],
        'block_html' => ['frontend' => 'stale_cache_enabled'],
        'reflection' => ['frontend' => 'stale_cache_enabled'],
        'config_integration' => ['frontend' => 'stale_cache_enabled'],
        'config_integration_api' => ['frontend' => 'stale_cache_enabled'],
        'full_page' => ['frontend' => 'stale_cache_enabled'],
        'translate' => ['frontend' => 'stale_cache_enabled']
    ],
],

Implementazione moderna della cache L2 di Symfony

[2.4.9-beta]{class="badge negative" title="Disponibile solo in versione 2.4.9-beta."}

A partire da Commerce 2.4.9, è possibile utilizzare l’implementazione della cache L2 basata su Symfony Cache (symfony_l2 backend) che fornisce un’implementazione di caching moderna e conforme a PSR-6 con miglioramenti significativi delle prestazioni rispetto alla tradizionale RemoteSynchronizedCache.

Vantaggi della cache L2 di Symfony

  • Architettura moderna: basata sui componenti della cache di Symfony (conforme a PSR-6)
  • Prestazioni migliori: supporto nativo per la serializzazione Igbinary, la compressione Gzip e gli script Lua
  • Connessioni persistenti: riduce il sovraccarico della connessione Redis o Valkey con il connection pooling
  • Chiavi di precaricamento: supporta il precaricamento della chiave della cache per i dati critici
  • Supporto cache non aggiornata: piena compatibilità con l’opzione use_stale_cache
  • Configurazione semplificata: nomi dei tipi di back-end di pulizia (redis, valkey, file)

Esempio di configurazione con cache L2 Symfony

Utilizza il tipo di back-end symfony_l2 semplificato per la cache L2:

'cache' => [
    'frontend' => [
        'default' => [
            'backend' => 'symfony_l2',
            'backend_options' => [
                // L2 (Remote): Redis with Symfony Cache
                'remote_backend' => 'redis',
                'remote_backend_options' => [
                    'server' => 'localhost',
                    'database' => '0',
                    'port' => '6379',
                    'password' => '',
                    'serializer' => 'igbinary',
                    'compression_lib' => 'gzip',
                    'persistent_id' => 'magento_l2_default',
                    'timeout' => '2.5',
                    'read_timeout' => '2.0',
                    'use_lua' => '1',
                    'preload_keys' => [
                        'prefix_EAV_ENTITY_TYPES:hash',
                        'prefix_GLOBAL_PLUGIN_LIST:hash',
                        'prefix_DB_IS_UP_TO_DATE:hash',
                        'prefix_SYSTEM_DEFAULT:hash',
                    ],
                ],
                // L1 (Local): File cache
                'local_backend' => 'file',
                'local_backend_options' => [
                    'cache_dir' => '/dev/shm/magento_l1'
                ],
                'cleanup_percentage' => 90,
            ],
        ]
    ],
    'type' => [
        'default' => ['frontend' => 'default'],
    ],
],

Cache Symfony L2 con cache non aggiornata

Configurare front-end separati per il supporto della cache non aggiornata:

'cache' => [
    'frontend' => [
        // Default frontend: NO stale cache
        'default' => [
            'backend' => 'symfony_l2',
            'backend_options' => [
                'remote_backend' => 'redis',
                'remote_backend_options' => [
                    'server' => 'localhost',
                    'database' => '0',
                    'port' => '6379',
                    'serializer' => 'igbinary',
                    'compression_lib' => 'gzip',
                    'persistent_id' => 'magento_l2_default',
                ],
                'local_backend' => 'file',
                'local_backend_options' => [
                    'cache_dir' => '/dev/shm/magento_l1'
                ],
            ],
        ],
        // Stale cache enabled frontend
        'stale_cache_enabled' => [
            'backend' => 'symfony_l2',
            'backend_options' => [
                'remote_backend' => 'redis',
                'remote_backend_options' => [
                    'server' => 'localhost',
                    'database' => '0',
                    'port' => '6379',
                    'serializer' => 'igbinary',
                    'compression_lib' => 'gzip',
                    'persistent_id' => 'magento_l2_stale',
                ],
                'local_backend' => 'file',
                'local_backend_options' => [
                    'cache_dir' => '/dev/shm/magento_l1_stale'
                ],
                'use_stale_cache' => true,
            ],
        ]
    ],
    'type' => [
        'default' => ['frontend' => 'default'],
        'layout' => ['frontend' => 'stale_cache_enabled'],
        'block_html' => ['frontend' => 'stale_cache_enabled'],
        'reflection' => ['frontend' => 'stale_cache_enabled'],
        'config_integration' => ['frontend' => 'stale_cache_enabled'],
        'config_integration_api' => ['frontend' => 'stale_cache_enabled'],
        'full_page' => ['frontend' => 'stale_cache_enabled'],
        'translate' => ['frontend' => 'stale_cache_enabled'],
    ],
],

Opzioni di back-end per la cache L2 di Symfony

Opzione
Tipo
Predefinito
Descrizione
remote_backend
stringa
'redis'
Tipo di back-end remoto: redis, valkey o file
remote_backend_options
array
[]
Configurazione back-end remota (consulta la documentazione di Redis/Valkey)
local_backend
stringa
'file'
Tipo di back-end locale: file o apcu
local_backend_options
array
[]
Configurazione back-end locale
cleanup_percentage
numero intero
90
Soglia pulizia cache L1 (1-100)
use_stale_cache
booleano
false
Abilita cache non aggiornata per un’elevata disponibilità

Supporto Valkey

Il backend symfony_l2 supporta anche Valkey come backend remoto:

'backend_options' => [
    'remote_backend' => 'valkey',  // Use Valkey instead of Redis
    'remote_backend_options' => [
        'server' => 'localhost',
        'database' => '0',
        'port' => '6379',
        'serializer' => 'igbinary',
        'compression_lib' => 'gzip',
    ],
    // ... rest of configuration
]

Per opzioni di configurazione dettagliate, vedi:

recommendation-more-help
commerce-operations-help-configuration