[内部部署]{class="badge informative" title="仅适用于Adobe Commerce内部部署项目。"}
用于性能优化的二级缓存配置
L2(两级)缓存通过在每个Web节点上添加本地缓存层,减少了远程缓存存储(Redis或Valkey)与Commerce应用程序之间的网络流量。 每个请求的标准Commerce实例传输大约300 KB,在某些情况下,流量可能会快速增长到1000多个请求。
通过二级缓存,每个Web节点将经常访问的数据存储在本地,并将远程缓存用于两个目的:
- 检查缓存数据版本,确保最新的缓存存储在本地
- 正在将更新的缓存数据从远程存储传输到本地计算机
Commerce会将经过哈希处理的数据版本存储在远程缓存中,并将后缀:hash附加到常规键中。 当本地缓存过期时,将通过缓存适配器从远程计算机中获取数据。
有两种可用的二级缓存实施:
旧版L2缓存配置(RemoteSynchronizedCache)
缓存配置说明取决于您的部署类型:
-
对于Cloud上的Adobe Commerce,可通过在
.magento.env.yaml中设置REDIS_BACKEND或VALKEY_BACKEND部署变量来配置二级缓存。 有关配置示例,请参阅配置二级缓存。 -
对于支持Redis的Adobe Commerce本地版本,请使用以下示例修改或替换
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'],
],
]
其中:
-
backend是二级缓存实现。 -
backend_options是二级缓存配置。remote_backend是远程缓存实现: Redis或MySQL。remote_backend_options是远程缓存配置。local_backend是本地缓存实现:Cm_Cache_Backend_Filelocal_backend_options是本地缓存配置。cache_dir是用于存储本地缓存的目录的文件缓存特定选项。
对于Adobe Commerce,Adobe建议使用Redis进行远程缓存(\Magento\Framework\Cache\Backend\Redis),使用Cm_Cache_Backend_File进行共享内存中数据的本地缓存,使用: 'local_backend_options' => ['cache_dir' => '/dev/shm/']
Adobe建议使用cache preload功能,因为它可显着降低Redis上的压力。 不要忘记为预加载密钥添加后缀“:hash”。
过时的缓存选项
从Commerce 2.4开始,use_stale_cache选项通过在并行进程中生成新缓存数据时提供以前缓存的数据,可以在特定情况下提高性能。
通常,从性能角度来看,锁定等待的权衡是可以接受的。 但是,随着块数或缓存条目的增加,锁定需要更多时间。 在某些情况下,等待时间最多可以为进程的键数 x 查找超时。 在极少数情况下,商家的Block/Config缓存中可能有数百个键,因此,即使是较小的锁查找超时也可能需要几秒钟。
'use_stale_cache' => true添加到二级缓存前端的最上层配置中。Adobe建议仅对从中获益最大的缓存类型启用use_stale_cache选项,包括:
block_htmlconfig_integration_apiconfig_integrationfull_pagelayoutreflectiontranslate
Adobe不建议为default缓存类型启用use_stale_cache选项。
以下代码显示了示例配置:
'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']
],
],
现代Symfony L2缓存实施
在Commerce版本2.4.9+中,使用基于Symfony缓存的二级缓存实现(symfony_l2后端),而不是旧的二级缓存。 Symfony L2缓存提供了符合PSR-6标准的现代化缓存实现,与传统RemoteSynchronizedCache相比,性能有了显着改进。
Symfony二级缓存的优势
- 现代体系结构:基于Symfony缓存组件构建(符合PSR-6)
- 更好的性能:对Igbinary序列化、gzip压缩和Lua脚本的本机支持
- 永久连接:减少连接池的Valkey连接开销
- 预加载密钥:支持为关键数据预加载缓存密钥
- 过时缓存支持:与
use_stale_cache选项完全兼容 - 简化的配置:清理器后端类型名称(
valkey,file)
Symfony L2缓存的配置示例
ece-tools)会自动管理缓存配置。 不要直接编辑app/etc/env.php — 部署将覆盖手动更改。 有关云配置,请参阅改为配置Symfony L2缓存。为L2缓存使用简化的symfony_l2后端类型:
'cache' => [
'frontend' => [
'default' => [
'backend' => 'symfony_l2',
'backend_options' => [
// L2 (Remote): Valkey with Symfony Cache
'remote_backend' => 'valkey',
'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'],
],
],
Symfony L2缓存和过时的缓存
配置单独的前端以支持过时的缓存:
'cache' => [
'frontend' => [
// Default frontend: NO stale cache
'default' => [
'backend' => 'symfony_l2',
'backend_options' => [
'remote_backend' => 'valkey',
'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' => 'valkey',
'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'],
],
],
Symfony L2缓存的后端选项
remote_backend'valkey'valkey或file。 将valkey用于L2缓存。remote_backend_options[]local_backend'file'file或apculocal_backend_options[]cleanup_percentage95use_stale_cachefalseremote_backend选项也接受值redis。 但是,Redis不是官方支持的Adobe Commerce 2.4.9及更高版本的缓存服务。 Adobe建议仅使用valkey配置symfony_l2。 按版本查看支持的缓存服务的系统要求。增强的Symfony L2缓存性能和可靠性
symfony_l2的Adobe Commerce 2.4.9部署,并随修补程序ACP2E-5132一起提供。 有关最新的修补程序发行说明,请参阅Commerce云修补程序。最新的更新提高了Symfony L2缓存的可扩展性,减少了不必要的文件系统I/O,并增强了缓存一致性和可靠性。
优化的Symfony L2缓存标记存储
通过消除冗余的文件系统标记索引写入,优化了Symfony L2缓存行为,以便进行Valkey支持的部署。 缓存标记现在专门存储在Valkey中,与Symfony L2缓存行为与旧版缓存实施一致。 这减少了不必要的磁盘I/O,提高了缓存写入性能,并防止了var/cache/symfony/tags/目录的增长。
改进了基于文件的缓存行为
对于使用基于文件的缓存(没有Valkey)的部署,将继续维护本地标记索引以支持缓存失效。 标记索引现在写入配置的cache_dir而不是以前硬编码的var/cache位置,从而确保一致的缓存目录使用率并改进对自定义缓存配置的支持。
修复了重新标记后过时的标记成员身份
重新标记缓存条目可能会使其与不再属于它的标记相关联。 过时的标记成员身份现在会在重新标记时清除,因此缓存条目仅由当前分配给它们的标记失效。
固定冗余远程写操作(在保存不变时)
保存包含未更改内容的缓存条目仍会触发对远程(Valkey)后端的写入。 现在,当内容未更改时会跳过保存,从而减少不必要的远程写入。
基于L1大小的固定逐出(cleanup_percentage)
用于基于L1大小的逐出的cleanup_percentage阈值并非始终触发清理。 L1缓存逐出现在正确遵循配置的cleanup_percentage。
为过时的缓存添加了再生锁定
启用use_stale_cache且某个条目的远程副本暂时不可用时,现在只有一个进程会获得一个短期锁定以重新生成该条目。 对同一条目的其他并发请求将继续提供现有的局部值,而不是自己重新生成它,从而减少重新生成踩踏次数和冗余后端负载。
影响
- 消除了Valkey支持的Symfony L2缓存部署中的冗余文件系统标记索引写入,减少了磁盘I/O并防止了
var/cache/symfony/tags/目录的不必要增长。 - 确保基于文件的缓存部署始终使用为本地标记索引配置的
cache_dir,同时保留缓存失效行为。 - 防止因重新标记后遗留的标记成员资格过时而导致的错误缓存失效。
- 减少未更改缓存保存不必要的远程写入,从而降低网络和后端负载。
- 确保在配置的
cleanup_percentage阈值下可靠触发一级缓存逐出。 - 通过为每个键选择单个再生器而不是每个并发请求重建它,减少
use_stale_cache条条目的再生次数。
有关详细的配置选项,请参阅: