我目前有兴趣了解我在Redis pub / sub应用程序中订阅了哪些频道。当客户端连接到我们的服务器时,我们将它们注册到如下所示的通道:
user:user_id
原因是我希望能够看到谁是“在线”。我目前盲目地将消息发送到频道而不知道客户端是否在线,因为他们接收这些类型的消息并不重要。
为了使我的应用程序更智能,我希望能够发现客户端是否在线使用pub / sub API,如果它们处于脱机状态,则将其消息缓存到单独的redis队列中。当他们重新上线时,我可以向他们推送。
这不一定是100%准确,但越准确越好。我假设当一个频道订阅时没有创建一个通用键,所以我不能做一些像以下那样简单的事情:
redis-cli keys user*
找到所有在线用户。
我想到的另一个策略就是只要用户发布或从频道中删除自己(当客户端上网并关闭应用时客户端会自动处理),就维护我自己的Redis Set。这将是我需要管理的额外复杂层,我希望有一个更简单的方法来处理已经可用的数据。
答案 0 :(得分:6)
从Redis 2.8开始,您可以:
PUBSUB CHANNELS [pattern]
PUBSUB CHANNELS
command具有O(N)复杂度,其中N是活动通道的数量。
所以在你的情况下:
redis-cli PUBSUB CHANNELS user*
会给你想要的东西。
答案 1 :(得分:3)
目前没有命令通过订阅来显示“存在”哪些频道,但是存在“已批准”问题和实现此问题的拉取请求。
https://github.com/antirez/redis/issues/221
https://github.com/antirez/redis/pull/412
由于此调用的性质,它不能扩展,因此是“DEBUG”命令。
但是,还有其他一些方法可以解决您的问题。 如果您有理由相信可以订阅某个频道,您可以向其发送消息并查看结果。结果是获得消息的订阅者数量。如果你得到0,你知道他们不在那里。
假设您的user_ids
是增量的,您可能有兴趣使用SETBIT
将1或0设置为用户的偏移位来跟踪存在。然后,您可以执行新功能BITCOUNT
以查看有多少用户在线,以及GETBIT
确定特定用户是否在线。
我过去更具体地解决了您的问题的方式是通过信号通知我订阅了频道的订阅管理器。管理员然后通过发送空白消息来“ping”频道以确认存在订户,并且此后偶尔ping通道以确定用户是否仍在线。不理想,但比在生产中使用DEBUG CHANNELS
更好。
答案 2 :(得分:1)
我不知道查询正在订阅哪些频道的任何特定方式,而且你知道在发生这种情况时没有创建任何密钥是正确的。另外,我不会在生产中使用KEYS
命令,因为它实际上是一个调试命令。
您有正确的想法使用集合在用户联机时添加用户,然后使用SISMEMBER <set> <user_id>
进行查询,以确定是将消息发送给他们还是添加到Redis列表一旦他们上网就进行处理。
您需要弄清楚用户何时注销,以便您可以将其从在线用户列表中删除,但我对您的系统了解不足以确切知道您将如何进行此操作。
如果连接的客户端能够发回消息以通知服务器消息已被消费,您可以使用它来跟踪应存储哪些消息以供以后检索。
干杯, 麦克
答案 3 :(得分:1)
答案 4 :(得分:1)
您可以使用FastoRedis或FastoNoSql,发布/订阅对话框。
答案 5 :(得分:0)
* PUBSUB NUMSUB [channel-1 ... channel-N]
返回指定通道的订户数(不包括订阅模式的客户端)。
https://redis.io/commands/pubsub