Redis publish/subscribe: see what channels are currently subscribed to

randombits picture randombits · Jun 8, 2012 · Viewed 19.2k times · Source

I am currently interested in seeing what channels are subscribed to in a Redis pub/sub application I have. When a client connects to our server, we register them to a channel that looks like:

user:user_id

The reason for this is I want to be able to see who's "online". I currently blindly fire off messages to a channel without knowing if a client is online since it's not critical that they receive these types of messages.

In an effort to make my application smarter, I'd like to be able to discover if a client is online or not using the pub/sub API, and if they are offline, cache their messages to a separate redis queue which I can push to them when they get back online.

This does not have to be 100% accurate, but the more accurate it is, the better. I'm assuming a generic key does not get created when a channel gets subscribed to, so I cannot do something as trivial as:

redis-cli keys user* to find all online users.

The other strategy I've thought of is just maintaining my own Redis Set whenever a user published or removes themselves from a channel (which the client automatically handles when they hop online and close the app). That would be an additional layer of complexity that I need to manage and I'm hoping there is a more trivial approach with the data that's already available.

Answer

Pavel Nikolov picture Pavel Nikolov · Aug 1, 2016

As of Redis 2.8 you can do:

PUBSUB CHANNELS [pattern]

The PUBSUB CHANNELS command has O(N) complexity, where N is the number of active channels.

So in your case:

redis-cli PUBSUB CHANNELS user*

would give you want you want.