发布与订阅(也叫PUB/SUB)的特点是订阅者(Listener)负责订阅频道(Channel),发送者(Publisher)负责向频道发送二进制字符串消息。

每当有消息被发送至给定频道时,频道的所有订阅者都会收到消息。也可以把频道看作是电台,其中订阅者可以同时收听多个电台,而发送者则可以在任何电台发送消息。

 

使用Redis订阅与发布功能应该注意。

第一个,于Redis系统的稳定性有关。

对于旧版的Redis,如果一个客户端订阅了某个或某些频道,但它读取消息的速度不够快的话,那么不断挤压的消息会是的Redis输出缓冲区的体积变得越来越大,这可能会导致Redis的速度变慢,甚至直接崩溃。也可能会导致Redis被操作系统强制杀死,甚至导致操作系统本身不可用。

新版的Redis不会出现这种问题,它会自动断开不符合client-output-buffer-limit pubsub配置选项要求的订阅客户端。

第二个,与数据传输的可靠性有关。

任何网络系统在执行操作时都可能会遇上断线情况,而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。

如果客户端在执行订阅操作的过程中断线,客户端会丢失在断线期间发送的所有消息。

 

 

Redis提供了五个发布于订阅的命令。

1、PSUBSCRIBE 命令


用于订阅与给定模式相匹配的所有频道。

每个模式以 ‘*’ 作为匹配符,比如 ‘chat* ’匹配所有chat开头的频道。

new*匹配所有以new开头的频道。



127.0.0.1:6379> PSUBSCRIBE PATTERN [pattern ...]



例如,



127.0.0.1:6379> PSUBSCRIBE NEW*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "NEW*"
3) (integer) 1
1) "pmessage"
2) "NEW*"
3) "NEW1"
4) "HELLO WORLD"
1) "pmessage"
2) "NEW*"
3) "NEW2"
4) "HELLO WORLD TOO"



2、PUBSUB 命令


用于查看订阅与发布系统状态,它由数个不同格式的子命令组成。



127.0.0.1:6379> PUBSUB subcommand [argument [argument ...]]



例如,



127.0.0.1:6379> PUBSUB CHANNELS
(empty list or set)



3、PUBLISH 命令


用于向给定频道发送信息。一次只能向一个频道发送信息。



127.0.0.1:6379> PUBLISH CHANNEL MESSAGE



例如,



127.0.0.1:6379> PUBLISH NEW "HELLO"
(integer) 1
127.0.0.1:6379> PUBLISH NEW1 "HELLO"
(integer) 2
127.0.0.1:6379> PUBLISH NEW NEW1 "HELLO"
(error) ERR wrong number of arguments for 'publish' command
127.0.0.1:6379>



4、PUNSUBSCRIBE 命令


用于退订给定的模式,如果执行时没有给定任何模式,那么退订所有模式。



127.0.0.1:6379> PUNSUBSCRIBE [pattern [pattern ...]]



例如,



127.0.0.1:6379> PUNSUBSCRIBE NEW*
1) "punsubscribe"
2) "NEW*"
3) (integer) 0
127.0.0.1:6379> PUNSUBSCRIBE mychannecl
1) "punsubscribe"
2) "mychannecl"
3) (integer) 0
127.0.0.1:6379> PUNSUBSCRIBE mychannel
1) "punsubscribe"
2) "mychannel"
3) (integer) 0



5、SUBSCRIBE 命令


用于订阅给定的一个或多个频道。



127.0.0.1:6379> SUBSCRIBE channel [channel ...]



例如,



127.0.0.1:6379> SUBSCRIBE NEW1 NEW2 NEW3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "NEW1"
3) (integer) 1
1) "subscribe"
2) "NEW2"
3) (integer) 2
1) "subscribe"
2) "NEW3"
3) (integer) 3



6、UNSUBSCRIBE 命令


用于退订给定的一个或多个频道,如果执行时没有给定任何频道,那么退订所有频道。



127.0.0.1:6379> UNSUBSCRIBE [channel [channel ...]]



例如,



127.0.0.1:6379> UNSUBSCRIBE NEW*
1) "unsubscribe"
2) "NEW*"
3) (integer) 0