redis发布与订阅

本文讲解Redis发布(pub)与订阅(sub),它是一种消息通信模式,Redis的发布订阅机制包括三个主体,发布者,订阅者和Channel(频道)。

redis的发布与订阅的特点是订阅者负责订阅频道( channel),发送者( publisher)负责向频道发送二进制字符串消息(message)。当有信息被发送到定制的频道时,该频道的所有订阅者都将会受到消息。这个模式可以参考显示生活当中电台的运作流程。我们作为订阅者可以收听(即订阅)多个电台,而电台工作人员(发送者)可以在任何电台发送消息,收听的该电台的听众都可以收到该频道的消息。


redis订阅频道

redis的server端当中维持着一个pubsub_channels 属性是一个字典, 这个字典就用于保存订阅频道的信息。它是一个redis的list类型的结构。当客户端通过调用命令SUBSCRIBE进行订阅频道时,就把对应的客户端和订阅的频道通过字典pubsub_channels 中的频道信息进行关联。

比如:我们模拟三个客户端client1、client2、client3 同时订阅了channel1。命令如下:

SUBSCRIBE channel

redis发布与订阅

当三个客户端都订阅了channe1频道后,我们通过PUBLISH命令给channe1发送信息,看看三个订阅该频道的客户端,是否收到对应的信息,命令如下:

PUBLISH channel "hello redis"

redis发布与订阅

从上图可以看出,当发送者对频道发送信息时,三个客户端都可以收到订阅的信息。


redis发布与订阅常用命令:

1、Redis Subscribe 命令:用于订阅频道信息。如:

SUBSCRIBE channel

2、Redis Publish 命令:用于将信息发送到指定的频道。如:

PUBLISH channel "hello redis sub/pub"

3、Redis Psubscribe 命令:用于订阅一个或者多个按模糊条件匹配的频道,类似SQL中的like。如:(表示订阅所有以channel开始的所有频道)

PSUBSCRIBE channel*

4、Redis Pubsub 命令:用于查看订阅与发布系统状态,它由数个不同格式的子命令组成。比如查看活跃中的频道有哪些、频道的订阅者数量?如:

Pubsub  channels --活跃的频道
PUBSUB NUMSUB channel--频道channel的订阅者数量

redis发布与订阅

5、Redis Punsubscribe 命令:用于退订所有给定模式的频道。如果没有模式被指定,一个无参数的 PUNSUBSCRIBE 调用被执行,那么客户端订阅的频道都会被退订。

PUNSUBSCRIBE channel

6、Redis Unsubscribe 命令:用于退订给定的一个或多个频道的信息。如果没有指定频道,那么客户端订阅的所有频道都会被退订。

Unsubscribe

总结:

1、redis的订阅频道的信息是redis服务器进程自己维持在pubsub_channels链表字典当中。字典的KEY为被订阅的频道,值为订阅的客户端。

2、当发送者发送消息时,redis服务器遍历频道对应的所有客户端,然后将消息发送到所订阅的客户端上。

3、当有信息发送时,除了订阅该频道的客户端会收到消息,以及和订阅了匹配频道的客户端,其它客户端是收不到该信息的。

4、退订频道、退订模式和订阅频道、订阅模式是两组反操作。


应用场景:

俗话说的好,知识学得好不好,还得看用到哪。反正笔者看到redis的发布与订阅的模式的特点后,第一时间想到的是可以用来做一个实时聊天系统,还可以用来做分布式架构中写的过程,利用redis的实时发布功能,把要写入的值及时快速的分发到各个写入程序当中,保证分布式架构中数据的完整一致性。再比如博客系统和自媒体平台中,粉丝关注功能,就比如现在我的2000粉丝,当我发布文章时,就可以及时推送文章到粉丝的客户端上。总而言之,应用的场景比较多,需要大家多思考,多交流。