You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis订阅无报错但频道显示无订阅者的原因排查

Redis Pub/Sub订阅无效问题排查与解决

问题核心原因

你的代码仅执行了pubsub.subscribe(events=process_event),但未启动Redis PubSub的消息监听循环。redis-py的PubSub对象发送SUBSCRIBE命令后,若不持续监听消息,连接会立即断开,Redis会移除该订阅者,最终导致PUBSUB NUMSUB返回0、publish方法返回订阅者数量为0。

从redis-cli monitor记录能看到SUBSCRIBE命令被执行,但之后该客户端连接已关闭,因此Redis中无活跃订阅者。

解决方案

1. 启动PubSub监听线程

在WebSocket服务器代码中添加监听线程,保持订阅连接:

redis_connection = redis.Redis(
    host=settings.REDIS_HOST,
    port=settings.REDIS_PORT,
    db=settings.REDIS_CACHE_DB,
)
pubsub = redis_connection.pubsub()
pubsub.subscribe(events=process_event)

# 启动后台监听线程,自动处理消息
pubsub_thread = pubsub.run_in_thread(sleep_time=0.001)
# 如需停止线程,可调用 pubsub_thread.stop()

2. 手动监听消息(替代方案)

若不想使用线程,可手动循环监听:

import time

redis_connection = redis.Redis(
    host=settings.REDIS_HOST,
    port=settings.REDIS_PORT,
    db=settings.REDIS_CACHE_DB,
)
pubsub = redis_connection.pubsub()
pubsub.subscribe(events=process_event)

while True:
    # 获取消息,阻塞超时1秒(可调整)
    message = pubsub.get_message(timeout=1)
    if message:
        # 已通过subscribe回调处理,此处可省略或额外处理
        pass
    time.sleep(0.001)

3. 验证订阅状态

执行以下命令确认订阅者是否存在:

redis-cli CLIENT LIST | grep pubsub

若能看到状态为pubsub的客户端,说明订阅连接已正常保持。

额外检查点

  • 确认Redis服务器未配置连接超时(timeout参数默认0,无超时),避免订阅连接被自动断开。
  • 检查Redis的maxclients配置,确保未达到连接上限导致新连接被拒绝。

内容的提问来源于stack exchange,提问作者WindowsWeenie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:57:44