Redis发布订阅

Wednesday, January 17, 2018

概述

发布订阅(pub/sub)是一种消息通讯模式,发布者发布消息,订阅者接收消息.

  • 客户端订阅频道channel1

  • 新消息发送到频道channel1,客户端接收消息

常用命令

subscribe [channel1] [channel2]

订阅一个或多个频道,频道必须是完整名称,不会根据匹配符匹配

127.0.0.1:6379> subscribe channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2

unsubscribe [channel1] [channel2]

退订一个或多个频道,如果没有指定频道,会退订所有已经订阅的频道

127.0.0.1:6379> punsubscribe news.*
1) "punsubscribe"
2) "news.*"
3) (integer) 0

psubscribe [pattern1] [pattern2] … [pattern]

订阅一个或多个符合给定模式的频道,每个模式以*作为匹配符,比如 news* 匹配所有以 news 开头的频道( news.facebook、 news.google、 news.twitter 等等)

127.0.0.1:6379> psubscribe news.* food.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "psubscribe"
2) "food.*"
3) (integer) 2

punsubscribe [pattern1] [pattern2] … [pattern]

退订一个或多个符合给定模式的频道,每个模式以*作为匹配符,比如 news* 匹配所有以 news 开头的频道( news.facebook、 news.google、 news.twitter 等等)

如果没有指定模式,会退订所有已经订阅的模式

127.0.0.1:6379> punsubscribe news.*
1) "punsubscribe"
2) "news.*"
3) (integer) 0

publish [channel] [message]

发布消息到指定频道,返回接收到消息的订阅者数量

127.0.0.1:6379> publish channel1 hellosub
(integer) 1

pubsub [subcommand] [argument]

该命令是查看订阅与发布系统状态的内省命令,由数个不同格式的子命令组成

  • pubsub channels [pattern]

列出当前的活跃频道,活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内

pattern 参数是可选的:如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。 如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。

127.0.0.1:6379> pubsub channels
1) "channel2"
2) "channel1"
127.0.0.1:6379> pubsub channels channel1*
1) "channel1"
  • pubsub numsub [channel1] … [channeln]

返回指定频道的订阅者数量,订阅模式的客户端不计算在内

127.0.0.1:6379> pubsub numsub channel1 channel2
1) "channel1"
2) (integer) 2
3) "channel2"
4) (integer) 2
  • pubsub numpat

返回订阅模式的数量,不是订阅模式的客户端的数量,而是客户端订阅的所有模式的数量总和

127.0.0.1:6379> pubsub numpat
(integer) 2

完整实例

如下图gif所示,从左上至右下分别代表客户端1-4

  • 客户端1: 发布消息
  • 客户端2: 订阅频道 channel1 和 channel2
  • 客户端3: 订阅频道 channel1
  • 客户端4: 订阅频道 channel2

订阅完成后,在客户端1上分别往 channel1 和 channel2 上发布了两条消息,可以看到,客户端2收到了全部的消息,客户端3和客户端4收到了各自订阅频道上的两条信息.

缺点

Redis 的发布/订阅功能是基础功能,有以下几个缺点:

  1. Redis 并没有对AMQP, MQTT, Stomp等消息协议进行支持
  2. Redis 消息没有做持久化,一旦消息被发送,客户端如果没有收到消息就会丢失
  3. Redis 没有提供消息传输保障,如果客户端连接超时等情况下就不会收到消息

应用场景

显而易见的应用场景有两个:

  1. 构建实时消息系统,比如普通聊天, 群聊等功能
  2. 门户网站缓存更新: 后台更新数据后,CMS发布清除缓存消息到指定频道上,客户端缓存系统收到消息后更新缓存
Redis Redis

Redis事务Redis命令-Hash