Redis发布订阅

简介

Redis发布订阅是一种消息通信模式,发送者(PUBLISHER)发送消息,订阅者(SUBSCRIBER)接收消息,可以实现进程间的消息传递。

发布订阅实际就是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息

RedisSUBSCRIBE命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。

ChannelsSubscribeSubscribeSubscribeSubscribeChannelA客户端A客户端B客户端C客户端D

通过PUBLISH命令发送消息给Channel就能使客户端都能收到命令。

ChannelsMessageMessageMessageMessageChannelAPublish Message客户端A客户端B客户端C客户端D

常用命令

命令 描述
PSUBSCRIBE pattern [pattern...] 订阅一个或多个符合给定模式的频道。
PUBSUB subcommand [argument [argument...]] 查看订阅与发布系统状态。
PUBLISH channel message 将信息发送到指定频道。
PUNSUBSCRIBE [pattern [pattern...]] 退订所有给定模式的频道。
SUBSCRIBE channel [channel...] 订阅给定的一个或多个频道的信息。
UNSUBSCRIBE [channel [channel ...]] 退订给定的频道。

使用发布订阅

Redis有两种发布/订阅模式。

基于频道(Channel)的发布/订阅

基于频道(Channel)模式包含两种角色,分别是发布者和订阅者。发布者可以向指定的频道(channel)发送消息; 订阅者可以订阅一个或者多个频道(channel),所有订阅此频道的订阅者都会收到此消息。

  1. 发布者发布消息的命令是publish

    127.0.0.1:6379> publish channel1 hello
    (integer) 1
    
  2. 订阅频道的命令是 subscribe,可以同时订阅多个频道。

    127.0.0.1:6379> subscribe channel1
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe" // 消息类型
    2) "channel1" // 频道
    3) "hi" // hello
    

在订阅成功之前发布的消息,在订阅成功后是接收不到的。所以上面的订阅者要收到消息“hello”,必须要在发布者发布消息(publish channel1 hello)执行前就要订阅(subscribe channel1channel1

基于模式(Pattern)的发布/订阅

如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到信息。

ClientsChannels发布消息匹配匹配发送消息发送消息订阅Clients客户端A客户端BClients客户端1客户端2Clients客户端X客户端Yfruit.applefruit.*fruit.peachPublish Message

其中fruit.* 模式匹配了fruit.apple频道和fruit.peach频道,并且有不同的客户端分别订阅它们三个。当有信息发送到fruit.apple频道时,信息除了发送给ClientAClientB之外,还会发送给订阅fruit.*Client1Client2。同理如果有消息发布到fruit.peach,那么订阅了fruit.*的客户端同样也能收到。

发布订阅的缺点

  1. 发布的消息在Redis中不能持久化,因此必须先执行订阅再等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将被直接丢弃。
  2. 消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息被成功消费。
  3. Redis5.0新增了Stream数据类型,不但支持多播,还支持数据持久化,比发布/订阅更加强大。