[内部部署]{class="badge informative" title="仅适用于Adobe Commerce本地项目。"}

为默认缓存和页面缓存配置Redis

NOTE
对于云项目上的Adobe Commerce,有关缓存配置说明,请参阅Redis和Valkey服务配置的最佳实践。 Adobe Commerce 2.4.9或更高版本的2.4.5-p16、2.4.6-p14、2.4.7-p9和2.4.8-p5修补程序不支持Redis缓存。 在不支持Redis的缓存配置中使用Valkey。 按版本查看支持的缓存服务的系统要求

Commerce提供了命令行选项来配置Redis页面和默认缓存。 虽然可以通过编辑<Commerce-install-dir>app/etc/env.php文件来配置缓存,但建议使用命令行来配置缓存,尤其是对于初始配置。 命令行提供验证,确保配置语法正确。

先决条件:

安装Redis,然后再继续。

NOTE
对于在EC2上托管的Commerce实例,您可以使用AWS ElastiCache代替本地Redis实例。 请参阅为EC2实例配置Elasticache

Redis缓存实施

Adobe Commerce已使用这些Redis缓存后端实施:

  • 旧版Redis后端 (Cm_Cache_Backend_Redis) — 在旧版Redis配置中使用的已弃用实现。
  • Redis后端 (Magento\Framework\Cache\Backend\Redis) — 此主题中的命令行配置用于默认缓存和页面缓存的后端。
  • 二级缓存后端 (Magento\Framework\Cache\Backend\RemoteSynchronizedCache) — 两级缓存实现,使用Redis作为远程后端和本地文件缓存存储,以跨节点同步缓存数据。 请参阅二级缓存配置

配置Redis默认缓存

运行setup:config:set命令并指定Redis默认缓存的特定参数。

bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-<parameter>=<value>...

常见参数包括:

  • --cache-backend=redis启用Redis默认缓存。 如果已启用此功能,请忽略此参数。

  • --cache-backend-redis-<parameter>=<value>是配置默认缓存的键值对列表:

命令行参数
含义
默认值
cache-backend-redis-server
服务器
完全限定的主机名、IP地址或UNIX套接字的绝对路径。 默认值127.0.0.1表示Commerce服务器上安装了Redis。
127.0.0.1
cache-backend-redis-port
端口
Redis服务器侦听端口
6379
cache-backend-redis-db
数据库
如果默认缓存和全页缓存都使用Redis,则此为必填字段。 指定其中一个高速缓存的数据库编号;另一个高速缓存默认使用0。

重要提示:如果对多种高速缓存类型使用Redis,则数据库编号必须不同。 建议将默认高速缓存数据库编号指定为0,将页高速缓存数据库编号指定为1,将会话存储数据库编号指定为2。
0
cache-backend-redis-password
密码
配置Redis密码可启用其内置安全功能之一: auth命令,该命令要求客户端进行身份验证以访问数据库。 密码直接在Redis的配置文件中配置: /etc/redis/redis.conf
cache-backend-redis-compress-data
compress_data
设置为0可禁用压缩。
1
cache-backend-redis-compression-lib
compress_lib
要使用的压缩库。 支持的值包括snappylzfl4zzstdgzip。 留空将自动确定。
cache-backend-redis-use-lua
use_lua
为所有Redis操作启用或禁用Lua脚本。

默认值:保留在0 默认情况下,Lua模式处于禁用状态,以防止在启用Lua时捆绑的Redis库(1.17.x)出现的已知性能衰退和GraphQL缓存缺失问题。
0
cache-backend-redis-use-lua-on-gc
use_lua_on_gc
启用或禁用垃圾回收的Lua脚本(backend_clean_cache cron作业)。

默认值:保留在1 特意启用以确保在GC期间对原子标记集进行清理。 如果没有它,当backend_clean_cache cron与缓存保存操作同时运行时,可能会发生争用情况,使缓存条目在缓存标记索引中没有相应的记录。 这会导致基于标记的失效静默地失败 — 例如,更新产品价格可能不会使产品缓存失效,而是需要完全缓存刷新。
1

Lua模式

启用后,Lua模式将多个Redis操作(缓存写入、标记更新、垃圾回收)捆绑到通过EVALSHA在服务器端执行的单个原子脚本中。 这样可防止并发请求中的交错,例如,确保将缓存条目及其标记成员资格写入在一起。

WARNING
如果不了解Adobe Commerce版本的影响,请勿更改use_luause_lua_on_gc的默认值:
  • use_lua:在Adobe Commerce 2.4.7或2.4.8(库colinmollenhour/cache-backend-redis 1.17.1)中启用此项可能会导致缓存损坏和GraphQL缓存丢失问题。
  • use_lua_on_gc:在Adobe Commerce 2.4.8上禁用此项将删除垃圾收集期间的原子保护,并且可能导致基于标记的缓存失效静默失败,需要完全缓存刷新才能恢复。

示例命令(默认缓存)

以下示例启用Redis默认缓存,将主机设置为127.0.0.1,并将数据库编号指定为0。 Redis对所有其他参数使用默认值。

bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-server=127.0.0.1 --cache-backend-redis-db=0

配置Redis页面缓存

要在Commerce上配置Redis页面缓存,请使用其他参数运行setup:config:set命令。

bin/magento setup:config:set --page-cache=redis --page-cache-redis-<parameter>=<value>...

常见参数包括:

  • --page-cache=redis启用Redis页面缓存。 如果已启用此功能,请忽略此参数。

  • --page-cache-redis-<parameter>=<value>是配置页面缓存的键值对列表:

命令行参数
含义
默认值
page-cache-redis-server
服务器
完全限定的主机名、IP地址或UNIX套接字的绝对路径。 默认值127.0.0.1表示Commerce服务器上安装了Redis。
127.0.0.1
page-cache-redis-port
端口
Redis服务器侦听端口
6379
page-cache-redis-db
数据库
如果默认缓存和全页缓存都使用Redis,则此为必填字段。 指定其中一个高速缓存的数据库编号;另一个高速缓存默认使用0。
重要提示:如果对多种高速缓存类型使用Redis,则数据库编号必须不同。 建议将默认高速缓存数据库编号指定为0,将页高速缓存数据库编号指定为1,将会话存储数据库编号指定为2。
0
page-cache-redis-password
密码
配置Redis密码可启用其内置安全功能之一: auth命令,该命令要求客户端进行身份验证以访问数据库。 在Redis配置文件中配置密码: /etc/redis/redis.conf
page-cache-redis-compress-data
compress_data
设置为1以压缩全页缓存。 使用0禁用压缩。
0
page-cache-redis-compression-lib
compress_lib
要使用的压缩库。 支持的值包括snappylzfl4zzstdgzip。 留空将自动确定。

以下示例启用Redis页缓存,将主机设置为127.0.0.1,并将数据库编号分配给1。 所有其他参数均设置为默认值。

bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=127.0.0.1 --page-cache-redis-db=1
NOTE
从Adobe Commerce 2.4.9开始,Valkey在CLI工具中正式取代了Redis。 对于​版本2.4.8和更早版本,请使用等效的Redis CLI命令

查看Commerce环境配置

运行配置Redis缓存的命令可更新Commerce环境配置(<Commerce-install-dir>app/etc/env.php):

'cache' => [
    'frontend' => [
        'default' => [
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => '127.0.0.1',
                'database' => '0',
                'port' => '6379'
            ],
        ],
        'page_cache' => [
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => '127.0.0.1',
                'port' => '6379',
                'database' => '1',
                'compress_data' => '0'
            ]
        ]
    ]
],

配置其他缓存选项

Redis预加载功能

由于Commerce将配置数据存储在Redis缓存中,因此您可以预加载在页面之间重复使用的数据。 要查找必须预加载的键,请分析从Redis传输到Commerce的数据。 Adobe建议预载每个页面上加载的数据,如SYSTEM_DEFAULTEAV_ENTITY_TYPESDB_IS_UP_TO_DATE

Redis使用pipeline复合加载请求。 密钥应包含数据库前缀;例如,如果数据库前缀为061_,则预加载密钥将如下所示: 061_SYSTEM_DEFAULT

'cache' => [
    'frontend' => [
        'default' => [
            'id_prefix' => '061_',
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => 'redis',
                'database' => '0',
                'port' => '6379',
                'password' => '',
                'compress_data' => '1',
                'compression_lib' => '',
                'preload_keys' => [
                    '061_EAV_ENTITY_TYPES',
                    '061_GLOBAL_PLUGIN_LIST',
                    '061_DB_IS_UP_TO_DATE',
                    '061_SYSTEM_DEFAULT',
                ],
            ]
        ],
        'page_cache' => [
            'id_prefix' => '061_'
        ]
    ]
]

将预加载功能与L2缓存结合使用时,必须将:hash后缀添加到您的密钥中。 L2缓存只传输数据的散列,而不传输实际数据。

'preload_keys' => [
    '061_EAV_ENTITY_TYPES:hash',
    '061_GLOBAL_PLUGIN_LIST:hash',
    '061_DB_IS_UP_TO_DATE:hash',
    '061_SYSTEM_DEFAULT:hash',
],

并行生成

从Commerce 2.4.0版本开始,Adobe为希望消除等待锁定的用户引入了allow_parallel_generation选项。 默认情况下,该选项处于禁用状态,Adobe建议禁用该选项,直到您拥有过多的配置和/或块。

要启用并行生成

bin/magento setup:config:set --allow-parallel-generation

由于它是一个标志,因此不能用命令禁用它。 手动将配置值设置为false

    'cache' => [
        'frontend' => [
            'default' => [
                'id_prefix' => 'b0b_',
                'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
                'backend_options' => [
                    'server' => 'redis',
                    'database' => '0',
                    'port' => '6379',
                    'password' => '',
                    'compress_data' => '1',
                    'compression_lib' => ''
                ]
            ],
            'page_cache' => [
                'id_prefix' => 'b0b_'
            ]
        ],
        'allow_parallel_generation' => false
    ],

PHP Redis扩展

当您的环境支持本机PHP Redis扩展(phpredis)时,请使用该扩展:

使用apt

对于Debian或Ubuntu,请使用apt

sudo apt-get install php-redis
sudo systemctl restart php-fpm
php -m | grep redis

使用pecl

作为替代方法,请使用pecl

sudo pecl install redis
echo "extension=redis.so" | sudo tee /etc/php/<version>/mods-available/redis.ini
sudo phpenmod redis
sudo systemctl restart php-fpm
php -m | grep redis

验证Redis连接

要验证Redis和Commerce是否正确协同工作,请执行以下操作:

  1. 登录到运行Redis和Commerce的服务器。
  2. 打开终端。
  3. 使用redis-cli monitor命令或redis-cli ping命令检查连接。

如果命令成功,则Redis正在运行,并且可以与Commerce应用程序通信。 如果失败,则Redis和Commerce之间存在一个您需要解决的连接问题。

Redis监视命令

redis-cli monitor

页面缓存输出示例:

1476826133.810090 [0 127.0.0.1:52366] "select" "1"
1476826133.816293 [0 127.0.0.1:52367] "select" "0"
1476826133.817461 [0 127.0.0.1:52367] "hget" "zc:k:ea6_GLOBAL__DICONFIG" "d"
1476826133.829666 [0 127.0.0.1:52367] "hget" "zc:k:ea6_DICONFIG049005964B465901F774DB9751971818" "d"
1476826133.837854 [0 127.0.0.1:52367] "hget" "zc:k:ea6_INTERCEPTION" "d"
1476826133.868374 [0 127.0.0.1:52368] "select" "1"
1476826133.869011 [0 127.0.0.1:52369] "select" "0"
1476826133.869601 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DEFAULT_CONFIG_CACHE_DEFAULT__10__235__32__1080MAGENTO2" "d"
1476826133.872317 [0 127.0.0.1:52369] "hget" "zc:k:ea6_INITIAL_CONFIG" "d"
1476826133.879267 [0 127.0.0.1:52369] "hget" "zc:k:ea6_GLOBAL_PRIMARY_PLUGIN_LIST" "d"
...

如果两个命令都成功,则Redis设置正确。

检查压缩数据

要检查压缩的会话数据和页面缓存,请使用RESP.app工具。 它支持Commerce 2会话和页面缓存数据的自动解压缩,并以易于用户阅读的形式显示PHP会话数据。

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