发布-订阅(Publish-Subscribe,PubSub),简单的说,在发布-订阅模式下,想要发布事件的发布者会把消息发送到一个PubSub频道(Channel),这个频道会把这个事件投递给这个频道感兴趣的每一位订阅者。许多流行的消息传递中间件,比如Kafka和ZeroMQ,就是利用了这个模式来构建消息投递系统,Redis也是一样。

  SUBSCRIBE命令用来监听特定频道中可用消息,一个客户端可以使用SUBSCRIBE命令一次订阅多个频道消息,还可以使用PSUBSCRIBE命令订阅匹配指定模式的频道。要取消订阅频道,可以使用UNSUBSCRIBE命令。

  PUBLISH命令用于将一条消息发送到指定的频道,订阅了该频道的所有订阅者都会接收到这条消息。

  另一个重要的命令是PUBSUB,用于管理频道,我们可以通过PUBSUB CHANNELS命令获取当前活跃的频道。

相关命令

SUBSCRIBE、PUBLISH、PSUBSCRIBE、UNSUBSCRIBE、PUBSUB

操作

1、使用SUBSCRIBE订阅一个频道或多个频道

#在第一个终端执行
127.0.0.1:6379> SUBSCRIBE china #这里订阅一个china频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "china"
3) (integer) 1

#在第二个终端执行
127.0.0.1:6379> SUBSCRIBE china sichuan #这里订阅了两个频道,china和sichuan
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "china"
3) (integer) 1
1) "subscribe"
2) "sichuan"
3) (integer) 2

2、使用PUBLISH命令向频道发布消息

127.0.0.1:6379> PUBLISH china "I love you" #两个订阅者都会接收到这个消息
(integer) 2
127.0.0.1:6379> PUBLISH sichuan "chengdu" #只有订阅了sichuan这个频道的订阅者才会接收到这个消息
(integer) 1


#第一个终端
1) "message"
2) "china"
3) "I love you"

#第二个终端
1) "message"
2) "china"
3) "I love you"
1) "message"
2) "sichuan"
3) "chengdu"

3、使用PUBSUB命令获取当前活跃的频道

127.0.0.1:6379> PUBSUB CHANNELS
1) "china"
2) "sichuan"

4、使用UNSUBSCRIBE命令取消订阅频道

127.0.0.1:6379> UNSUBSCRIBE china
1) "unsubscribe"
2) "china"
3) (integer) 0
#但是并没有取消掉,所以这里需要找其他原因
其他内容

  对频道的生命周期而言,一个频道之前未被订阅过,那么使用SUBSCRIBE命令会自动创建频道,当频道上没有活跃的订阅者时,频道将会被删除。

  一定要特别注意,Redis的PubSub相关的机制均布支持持久化,也就是说,消息、频道和PubSub的关系都不会保存在磁盘上。如果服务器宕机或其他情况退出,那么这些数据都会丢失。如果频道没有订阅者,那么被发到频道上的消息将会丢失。所以Redis并没有保证消息投递的可靠性。

  总之,Redis的PubSub功能并不适合重要消息的投递场景。