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
相关产品推荐
相关产品推荐

