Pub/Sub viewer

functional

Subscribe to channels or patterns and watch messages arrive live.

The Pub/Sub viewer subscribes to channels and patterns and shows every message as it arrives: one row per message with the time SQLly received it, the channel, the pattern it matched (for pattern subscriptions), and the payload. It lives in the Activity Monitor as the Pub/Sub tab on Redis and Redis-compatible connections (Valkey, KeyDB, Dragonfly, Amazon ElastiCache, Amazon MemoryDB). The command palette's Redis Pub/Sub Viewer… and Pub/Sub… on a Redis database's right-click menu open the monitor straight onto it.

Subscribing

Type one or more names, comma-separated, and press Subscribe. A plain name (orders) subscribes with SUBSCRIBE; a name with glob characters (alerts.*, metrics.[ab], job?) subscribes with PSUBSCRIBE. To subscribe to a channel whose name itself contains glob characters, start it with =: =orders[eu] subscribes to the channel literally named orders[eu] (write ==x for a channel named =x). Names cannot contain commas, since the comma separates them. Like the Profiler, the viewer opens a dedicated connection for this - the editor still refuses SUBSCRIBE, because a subscribed connection can no longer run ordinary commands. A subscription has no time box: Stop, switching tabs, closing the monitor (docked or popped out), disconnecting the connection, or deleting it closes that connection at once. Sharded pub/sub (SSUBSCRIBE) is not supported.

Because the viewer dials the server itself, it needs a direct connection. On a connection routed through a relay bridge the tab explains that and Subscribe stays disabled.

Reading messages

Messages list newest first. Pause stops recording without dropping the subscription (messages keep arriving and are counted), and Clear empties the list. The list is capped - 1,000 messages by default, adjustable up to 100,000 - and when it is full the oldest messages are dropped; the status line counts how many. The table shows at most the newest 2,000 of them, and the status line says so when the list holds more. The table keeps your place while messages arrive: the selected message stays selected (until it is dropped from the list), and if you scroll down the rows you are reading stay put, so you can select a row on a busy channel and Preview Payload opens that message in the value viewer, where the format picker can show it as text, pretty JSON, hex, or decoded MessagePack. Binary payloads are kept byte-exact and shown as hex rather than mangled into text, and a channel or pattern name that is not valid UTF-8 shows its bytes as \xHH escapes.

A message can be up to 512 MB, so the viewer keeps at most the first 64 KiB of each payload (and the first 1 KiB of a channel or pattern name). A cut payload says so in the table, as … (truncated, N bytes) with its full size, and Preview Payload opens the part that was kept with a notice giving both sizes. The whole list is also held to 64 MB: past that the oldest messages are dropped, and counted, the same way as when the message cap is reached.

SQLly
Redis Pub/Sub viewer: channel and pattern subscriptions, live messages newest first, and the message cap in the status line.
Redis Pub/Sub viewer: channel and pattern subscriptions, live messages newest first, and the message cap in the status line.

Pub/Sub messages are fire-and-forget: the viewer only sees what is published while it is subscribed, and nothing is replayed. An ACL user needs the +subscribe / +psubscribe permissions and access to the channels (&pattern).