我正在尝试通过 websockets 发送实时反馈,并且我通过 redis 从 Rest-api 服务器发送数据到 websocker 服务器(均用 python/django 编写)来实现这一点。在 websocket 服务器中,我订阅了一个名为“events”的频道,如下所示:
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)
在rest-api服务器中,我将数据发布到同一个redis通道,如下所示:
connection.publish("events", json.dumps({"user_email": user.email, "message": message}))
在试图找出为什么没有事件到达“process_event”处理程序时,我发现发布方法返回频道的订阅者数量,因此我将该行更新为:
count = connection.publish("events", json.dumps({"user_email": user.email, "message": message}))
print(f"Published to events channel with {count} subscribers")
即使在上述订阅之后,结果始终为 0。当我直接尝试查询订阅者计数时,我进入了 redis-stack Docker 容器,看到了以下内容:
redis-cli
127.0.0.1:6379> PUBSUB NUMSUB 事件
- “事件”
- (整数)0
127.0.0.1:6379>
redis-stack 本身的日志似乎无法识别任何订阅或发布。但是,如果我使用命令“redis-cli monitor”,我会看到两者都出现:
1727460056.950779 [0 172.17.0.1:58210]“客户端”“SETINFO”“LIB-NAME”“redis-py” 1727460056.952892 [0 172.17.0.1:58210]“客户端”“SETINFO”“LIB-VER”“5.0.8” 1727460056.954072 [1 172.17.0.1:58210]“选择”“1”
1727460056.956442 [1 172.17.0.1:58210]“订阅”“活动”
1727460122.677189 [0 172.17.0.1:45874]“客户端”“SETINFO”“LIB-NAME”“redis-py” 1727460122.678973 [0 172.17.0.1:45874]“客户端”“SETINFO”“LIB-VER”“5.0.8” 1727460122.681286 [1 172.17.0.1:45874]“选择”“1”
1727460122.683120 [1 172.17.0.1:45874] "发布" "事件" "{"user_email": "[电子邮件受保护]", "message": "消息内容"}"
毕竟,PUBSUB NUMSUB 事件仍然给出相同的结果。
所以为什么你没有运行任何事件是因为它不像套接字,你没有收到推送通知,你创建的
pubsub
对象需要拉取消息:
redis_pubsub.get_message()
为什么,你在
NUMSUB
上得到0——我怀疑当你发送消息时你的客户端没有连接。