Redis发布/订阅:查看当前订阅的频道

ran*_*its 12 publish-subscribe redis

我目前有兴趣了解我在Redis pub/sub应用程序中订阅了哪些频道.当客户端连接到我们的服务器时,我们将它们注册到如下所示的通道:

user:user_id

原因是我希望能够看到谁是"在线".我目前盲目地将消息发送到频道而不知道客户端是否在线,因为他们接收这些类型的消息并不重要.

为了使我的应用程序更智能,我希望能够发现客户端是否在线使用pub/sub API,如果它们处于脱机状态,请将其消息缓存到我可以推送的单独redis队列中当他们回到网上时他们.

这不一定是100%准确,但越准确越好.我假设当一个频道订阅时没有创建一个通用密钥,所以我不能做一些简单的事情:

redis-cli keys user* 找到所有在线用户.

我想到的另一个策略就是只要用户发布或从频道中删除自己(当客户端上网并关闭应用时客户端自动处理),就可以维护我自己的Redis Set.这将是我需要管理的额外复杂层,我希望有一个更简单的方法来处理已经可用的数据.

Pav*_*lov 6

从Redis 2.8开始,您可以:

PUBSUB CHANNELS [pattern]
Run Code Online (Sandbox Code Playgroud)

PUBSUB CHANNELS命令具有O(N)复杂度,其中N是活动信道的数量.

所以在你的情况下:

redis-cli PUBSUB CHANNELS user*
Run Code Online (Sandbox Code Playgroud)

会给你想要你想要的.


mkg*_*der 1

我不知道有任何特定的方法来查询正在订阅的频道,并且您是正确的,发生这种情况时没有创建任何密钥。另外,无论如何我都不会KEYS在生产中使用该命令,因为它实际上是一个调试命令。

您有正确的想法,即使用一组在用户在线时添加用户,然后查询该用户以SISMEMBER <set> <user_id>确定是否应将消息发送给他们或添加到 Redis 列表中以便在用户上线后进行处理。

您需要弄清楚用户何时注销,以便您可以将其从在线用户列表中删除,但我对您的系统了解不够,无法确切知道您将如何处理。

如果连接的客户端能够发回消息以通知服务器消息已被使用,您可以使用它来跟踪应存储哪些消息以供以后检索。

干杯,迈克