ran*_*its 12 publish-subscribe redis
我目前有兴趣了解我在Redis pub/sub应用程序中订阅了哪些频道.当客户端连接到我们的服务器时,我们将它们注册到如下所示的通道:
user:user_id
原因是我希望能够看到谁是"在线".我目前盲目地将消息发送到频道而不知道客户端是否在线,因为他们接收这些类型的消息并不重要.
为了使我的应用程序更智能,我希望能够发现客户端是否在线使用pub/sub API,如果它们处于脱机状态,请将其消息缓存到我可以推送的单独redis队列中当他们回到网上时他们.
这不一定是100%准确,但越准确越好.我假设当一个频道订阅时没有创建一个通用密钥,所以我不能做一些简单的事情:
redis-cli keys user* 找到所有在线用户.
我想到的另一个策略就是只要用户发布或从频道中删除自己(当客户端上网并关闭应用时客户端自动处理),就可以维护我自己的Redis Set.这将是我需要管理的额外复杂层,我希望有一个更简单的方法来处理已经可用的数据.
从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)
会给你想要你想要的.
我不知道有任何特定的方法来查询正在订阅的频道,并且您是正确的,发生这种情况时没有创建任何密钥。另外,无论如何我都不会KEYS在生产中使用该命令,因为它实际上是一个调试命令。
您有正确的想法,即使用一组在用户在线时添加用户,然后查询该用户以SISMEMBER <set> <user_id>确定是否应将消息发送给他们或添加到 Redis 列表中以便在用户上线后进行处理。
您需要弄清楚用户何时注销,以便您可以将其从在线用户列表中删除,但我对您的系统了解不够,无法确切知道您将如何处理。
如果连接的客户端能够发回消息以通知服务器消息已被使用,您可以使用它来跟踪应存储哪些消息以供以后检索。
干杯,迈克
| 归档时间: |
|
| 查看次数: |
16238 次 |
| 最近记录: |