必须在协程内初始化swoole\coroutine\redis实例并调用connect(),否则失败;每个协程需独立创建连接,不可复用或跨协程传递,且subscribe后连接变为只读、不可执行其他命令。

直接用 Swoole\Coroutine\Redis,不配连接池、不改配置项,连上就能发命令——但必须在协程环境里初始化,否则 connect() 会失败。
协程内 new Redis 并 connect 是唯一安全起点
协程客户端不是“配置好再复用”的传统组件,它生命周期绑定当前协程。你不能在主进程或非协程上下文里 new 它,也不能跨协程传递实例。
-
new Swoole\Coroutine\Redis()必须在go()或Co\run()内部调用 -
$redis->connect()返回false时,不要重试或 sleep,应立即 throw 异常或 return —— 协程调度器不会帮你等网络就绪 - 连接参数只支持 host/port/database(可选),不支持 unix socket、auth 字符串(需手动
auth())、timeout 配置(超时由协程调度器统一控制)
database 参数不等于 SELECT 命令,且默认是 0
构造时传 ['database' => 1] 不生效;connect() 方法也不接受该参数。真正切换库得靠 $redis->select(1),但它必须在 connect() 成功后立刻调用,且不能在订阅模式下执行。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 未调用
select()时,默认操作db 0 -
select()是普通命令,一旦进入subscribe()状态,再调就会报错ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context - 如果需要多库隔离,建议按库分连接,而不是复用同一连接反复
select()
连接失败的常见表现和应对方式
不是抛异常,而是 connect() 返回 false,且后续所有命令(如 get())返回 false 或空数组,errno 为 0 —— 这是 Swoole 协程 Redis 的典型静默失败特征。
- 检查 Redis 服务是否监听
127.0.0.1:6379(不是localhost,后者可能走 socket) - 确认
redis.conf中bind包含127.0.0.1,且protected-mode no(开发环境)或已配密码 - 若需密码,必须在
connect()后立刻调用$redis->auth('your-pass'),返回true才算认证成功 - 别依赖
ping()判断连通性:未 connect 时ping()也返回false,无区分度
并发场景下别共享同一个 $redis 实例
多个协程共用一个 $redis 实例会导致命令乱序、recv() 拿到错消息、甚至连接被意外关闭——Swoole 协程 Redis 不是线程/协程安全的“连接池句柄”,它就是一条裸连接。
- 每个协程应独立
new+connect,哪怕只是做一次get() - 高频短连接(如每次 HTTP 请求查一次 Redis)不必担心开销:协程 connect 是非阻塞的,底层复用 TCP 连接池(由 Swoole 自动管理)
- 真要优化,应封装成工厂函数,而非全局单例或静态属性 —— 静态变量在协程间不隔离,极易引发状态污染
最易忽略的一点:subscribe() 后的连接彻底变“只读”通道,不能再发任何非订阅类命令,包括 select()、auth()、set(),甚至连 ping() 都会失败。这种状态不可逆,只能断开重连。










