必须在协程内初始化并连接redis:1. 用go()或co\run()启动协程;2. 在协程内new swoole\coroutine\redis()并调用connect(),失败立即终止;3. 认证用auth()、切库用select()(订阅后不可用),多库应分连接;4. 每协程独享实例,禁止复用或跨协程传递。

在Swoole协程环境下安全、可靠地连接Redis,必须确保new和connect都发生在协程内部,否则connect()会静默返回false且后续命令全部失效。
初始化协程Redis实例
第一步:用go()或Co\run()启动协程上下文,这是硬性前提。【不在协程里new Swoole\Coroutine\Redis(),后续所有操作注定失败】
第二步:在协程函数体内执行$redis = new Swoole\Coroutine\Redis();——注意不要写成new Redis()(虽然部分版本兼容,但易与phpredis扩展混淆,官方文档明确推荐全名)。
第三步:立即调用$redis->connect('127.0.0.1', 6379)。若返回false,必须立刻终止流程,不要sleep重试——协程调度器不会帮你等网络就绪,盲目等待只会卡住当前协程。
处理认证与数据库切换
方法一:密码认证必须在connect()成功后立刻执行$redis->auth('your-pass'),返回true才算真正完成认证。如果connect()失败,auth()也会失败,但此时调用auth毫无意义。
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
方法二:切换数据库只能用$redis->select(1),不能靠构造时传['database' => 1]——这个参数完全不生效。而且【一旦执行过subscribe(),再调select()会直接报错】,因为订阅模式下只允许SUBSCRIBE/UNSUBSCRIBE/PING/QUIT四条命令。
方法三:需要多库隔离时,别反复select(),应为每个db单独维护一个协程内独立连接。
避免连接复用陷阱
绝对不要把同一个$redis实例传给多个协程。例如在HTTP请求回调中,不能把主协程创建的$redis对象use进子协程——这会导致recv()拿到错消息、命令乱序、连接意外关闭。
高频短连接场景下,每次HTTP请求都new + connect是安全且推荐的做法。Swoole底层自动复用TCP连接池,开销远低于传统阻塞连接。
若需连接池,必须自行封装工厂函数或使用SplQueue管理连接队列,不可依赖全局单例或静态变量。










