Symfony 5使用RedisTagAwareAdapter实现带标签缓存保存失败问题
问题排查方案及常见原因
按照优先级从高到低依次排查即可定位问题:
1. 检查phpredis扩展版本
RedisTagAwareAdapter要求phpredis扩展版本 >= 5.0,低版本扩展仅能支持基础RedisAdapter的读写操作,用到标签相关的新增API时会静默失败。
执行以下命令即可查看当前安装的phpredis版本:
php -r "echo phpversion('redis');"
如果版本低于5.0,升级phpredis扩展到最新稳定版即可解决。
2. 检查Redis服务端是否禁用了Lua脚本
标签的原子绑定、失效逻辑依赖Redis的EVAL命令执行Lua脚本实现,如果你的Redis配置中禁用了该命令,会导致写入流程直接失败。
连接到Redis服务端执行以下命令验证权限:
EVAL "return 1" 0
如果返回命令不存在/禁用类错误,修改redis.conf移除disable-commands eval配置,重启Redis即可恢复。
3. 补充RedisTagAwareAdapter构造参数
Symfony 5的部分迭代版本(5.2.x、5.3.x)存在已知逻辑问题,构造RedisTagAwareAdapter时不传第二个命名空间参数会导致标签关联键生成异常,最终写入返回false。修改实例化代码补充参数即可:
// 第二个参数为自定义缓存命名空间,第三个为全局默认过期时间 $cache = new RedisTagAwareAdapter($client, 'app_cache', 3600);
4. 开启缓存异常抛出定位具体问题
Symfony缓存组件默认开启静默失败配置,不会抛出执行过程中的异常。你可以临时开启异常抛出来获取具体错误信息:
在项目config/packages/cache.yaml中添加如下配置:
framework: cache: throw_exceptions: true
配置生效后再次执行保存逻辑,会抛出具体的异常信息,可直接定位根因。
内容的提问来源于stack exchange,提问作者Matthew Zarbatany
相关产品推荐
相关产品推荐

