Skip to content

Pub/Sub

Pub/Sub commands for real-time messaging between clients. Messages are broadcast to all subscribers of a channel.

CommandSyntaxDescription
SUBSCRIBESUBSCRIBE channel [channel ...]Subscribe to channels
UNSUBSCRIBEUNSUBSCRIBE [channel ...]Unsubscribe from channels
PUBLISHPUBLISH channel messagePublish message to channel
PSUBSCRIBEPSUBSCRIBE pattern [pattern ...]Subscribe to pattern-matched channels
PUNSUBSCRIBEPUNSUBSCRIBE [pattern ...]Unsubscribe from patterns
  1. Clients subscribe to channels using SUBSCRIBE or PSUBSCRIBE
  2. Publishers send messages with PUBLISH
  3. All subscribed clients receive the message
  4. Messages are not persisted - if no subscribers, message is lost

Terminal 1 (Subscriber):

Terminal window
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
# When message arrives:
1) "message"
2) "news"
3) "Breaking: Redlite 1.0 released!"

Terminal 2 (Publisher):

Terminal window
127.0.0.1:6379> PUBLISH news "Breaking: Redlite 1.0 released!"
(integer) 1 # Number of subscribers who received it

Subscriber:

Terminal window
127.0.0.1:6379> SUBSCRIBE sports weather news
Reading messages...
1) "subscribe"
2) "sports"
3) (integer) 1
1) "subscribe"
2) "weather"
3) (integer) 2
1) "subscribe"
4) "news"
3) (integer) 3
# Messages from any channel:
1) "message"
2) "sports"
3) "Goal!"
1) "message"
2) "weather"
3) "Sunny, 72F"

Subscribe to all channels matching a pattern:

Subscriber:

Terminal window
127.0.0.1:6379> PSUBSCRIBE news:*
Reading messages...
1) "psubscribe"
2) "news:*"
3) (integer) 1
# Matches news:sports, news:tech, news:local, etc.
1) "pmessage"
2) "news:*"
3) "news:tech"
4) "New iPhone announced"
1) "pmessage"
2) "news:*"
3) "news:sports"
4) "Championship finals tonight"

Publisher:

Terminal window
127.0.0.1:6379> PUBLISH news:tech "New iPhone announced"
(integer) 1
127.0.0.1:6379> PUBLISH news:sports "Championship finals tonight"
(integer) 1
127.0.0.1:6379> PUBLISH weather "Sunny"
(integer) 0 # No pattern match
Terminal window
# Unsubscribe from specific channels
127.0.0.1:6379> UNSUBSCRIBE news weather
1) "unsubscribe"
2) "news"
3) (integer) 1
1) "unsubscribe"
2) "weather"
3) (integer) 0
# Unsubscribe from all channels
127.0.0.1:6379> UNSUBSCRIBE
1) "unsubscribe"
2) (nil)
3) (integer) 0
# Unsubscribe from patterns
127.0.0.1:6379> PUNSUBSCRIBE news:*
1) "punsubscribe"
2) "news:*"
3) (integer) 0
Terminal window
# PUBLISH returns number of subscribers
127.0.0.1:6379> PUBLISH mychannel "test"
(integer) 3 # 3 clients received the message
127.0.0.1:6379> PUBLISH emptychannel "test"
(integer) 0 # No subscribers
PatternMatches
*Any sequence of characters
?Any single character
[abc]Any character in brackets

Examples:

  • news:* matches news:sports, news:tech, news:local
  • user:? matches user:1, user:a but not user:12
  • log:[we]rror matches log:error, log:wrror
1) "subscribe" # Message type
2) "channel-name" # Channel subscribed to
3) (integer) N # Total subscriptions for this client
1) "message" # Message type
2) "channel-name" # Source channel
3) "message-body" # The message content
1) "pmessage" # Message type (pattern)
2) "pattern" # Pattern that matched
3) "channel-name" # Actual channel
4) "message-body" # The message content
  • Messages are delivered to current subscribers only
  • If no subscribers exist, the message is lost
  • No message persistence or history
  • No acknowledgment or retry mechanism

Once a client enters subscription mode:

  • Only SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, and QUIT are allowed
  • Regular commands like GET, SET are not available
  • Use a separate connection for commands

Pub/Sub requires server mode because:

  • Requires persistent TCP connections
  • Real-time message delivery
  • Multiple client coordination
Terminal window
# User activity channel
SUBSCRIBE user:123:notifications
# Send notification
PUBLISH user:123:notifications '{"type":"message","from":"user:456"}'
Terminal window
# Join room
SUBSCRIBE room:general
# Send message
PUBLISH room:general '{"user":"alice","text":"Hello everyone!"}'
Terminal window
# All app instances subscribe
PSUBSCRIBE cache:invalidate:*
# When data changes
PUBLISH cache:invalidate:users "user:123"
PUBLISH cache:invalidate:products "product:456"
Terminal window
# Subscribe to all events
PSUBSCRIBE events:*
# Publish events
PUBLISH events:user:created '{"id":123}'
PUBLISH events:order:completed '{"id":456}'
Terminal window
# Leader election channel
SUBSCRIBE leader:election
# Announce leadership
PUBLISH leader:election '{"node":"node-1","action":"claim"}'
FeaturePub/SubStreams
PersistenceNoYes
Message historyNoYes
Consumer groupsNoYes
AcknowledgmentNoYes
Blocking readSubscribe-basedXREAD BLOCK
Use caseReal-time broadcastReliable queuing

Use Pub/Sub for fire-and-forget broadcasting. Use Streams when you need reliability and history.