发布与订阅

  • 概述

  • 快速入门

  • 注意事项

概述

Redis 的发布与订阅功能可以让用户将消息同时发送给多个客户端。

Redis 的发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

这个功能由几个不同的角色协作组成:

  • 发布者(publisher):发布消息的客户端。

  • 频道(channel):构建在服务器内部,负责接收发布者发送的消息,并将消息转发给频道的订阅者。

  • 模式(pattern):构建在服务器内部,负责对频道进行匹配,当被匹配的频道接到消息时,模式也会将消息转发给模式的订阅者。

  • 订阅者(subscriber):通过订阅频道或者模式来获取消息的客户端。每个频道或者模式都可以有任意多个订阅者。

发布订阅命令

| 命令 | 描述 |

|-------------------------------------------------|-------------------|

| PUBSUB subcommand [argument [argument 'hello']] | 查看订阅与发布系统状态。 |

| PUBLISH channel message | 将信息发送到指定的频道。 |

| SUBSCRIBE channel [channel 'hello'] | 订阅给定的一个或多个频道的信息。 |

| UNSUBSCRIBE [channel [channel 'hello']] | 指退订给定的频道。 |

| PSUBSCRIBE pattern [pattern 'hello'] | 订阅一个或多个符合给定模式的频道。 |

| PUNSUBSCRIBE [pattern [pattern 'hello']] | 退订所有给定模式的频道。 |

快速入门

订阅者:打开一个终端,订阅频道 [channel:notice]


[root@localhost ~]# redis-cli -p 6377 --raw

127.0.0.1:6377> SUBSCRIBE channel:notice

subscribe

channel:notice

1



message

channel:notice

hi welcome



message

channel:notice

大家好

订阅者:打开第二个终端,订阅频道 [channel:notice]


[root@localhost ~]# redis-cli -p 6377

127.0.0.1:6377>  SUBSCRIBE channel:notice

Reading messages... (press Ctrl-C to quit)

1) > subscribe

2) > channel:notice

3) (integer) 1

1) > message

2) > channel:notice

3) > hi welcome

1) > message

2) > channel:notice

3) > \xe5\xa4\xa7\xe5\xae\xb6\xe5\xa5\xbd> 

发布者:打开一个终端,用于给频道 [channel:notice] 发布消息


[root@localhost ~]# redis-cli -p 6377

127.0.0.1:6377>  PUBLISH channel:notice > hi welcome> 

(integer) 2

127.0.0.1:6377>  PUBLISH channel:notice > 大家好> 

(integer) 2

注意事项

  • 客户端需要及时消费和处理消息

    客户端订阅了channel之后,如果接收消息不及时,可能导致DCS实例消息堆积,当达到消息堆积阈值(默认值为32MB),或者达到某种程度(默认8MB)一段时间(默认为1分钟)后,服务器端会自动断开该客户端连接,避免导致内部内存耗尽。

  • 客户端需要支持重连

    当连接断开之后,客户端需要使用subscribe或者psubscribe重新进行订阅,否则无法继续接收消息。

  • 不适用于消息可靠性要求高的场景中

    Redis的发布订阅不是一种可靠的消息系统。当出现客户端连接退出,或者极端情况下服务端发生主备切换时,未消费的消息会被丢弃。