Redis发布订阅
简介
Redis发布订阅是一种消息通信模式,发送者(PUBLISHER)发送消息,订阅者(SUBSCRIBER)接收消息,可以实现进程间的消息传递。
发布订阅实际就是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息。
Redis的SUBSCRIBE
命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
通过PUBLISH
命令发送消息给Channel就能使客户端都能收到命令。
常用命令
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern...] |
订阅一个或多个符合给定模式的频道。 |
PUBSUB subcommand [argument [argument...]] |
查看订阅与发布系统状态。 |
PUBLISH channel message |
将信息发送到指定频道。 |
PUNSUBSCRIBE [pattern [pattern...]] |
退订所有给定模式的频道。 |
SUBSCRIBE channel [channel...] |
订阅给定的一个或多个频道的信息。 |
UNSUBSCRIBE [channel [channel ...]] |
退订给定的频道。 |
使用发布订阅
Redis有两种发布/订阅模式。
基于频道(Channel)的发布/订阅
基于频道(Channel)模式包含两种角色,分别是发布者和订阅者。发布者可以向指定的频道(channel)发送消息; 订阅者可以订阅一个或者多个频道(channel),所有订阅此频道的订阅者都会收到此消息。
-
发布者发布消息的命令是
publish
。127.0.0.1:6379> publish channel1 hello (integer) 1
-
订阅频道的命令是 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 channel1
)channel1。
基于模式(Pattern)的发布/订阅
如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到信息。
其中fruit.*
模式匹配了fruit.apple
频道和fruit.peach
频道,并且有不同的客户端分别订阅它们三个。当有信息发送到fruit.apple
频道时,信息除了发送给ClientA和ClientB之外,还会发送给订阅fruit.*
的Client1和Client2。同理如果有消息发布到fruit.peach
,那么订阅了fruit.*
的客户端同样也能收到。
发布订阅的缺点
- 发布的消息在Redis中不能持久化,因此必须先执行订阅再等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将被直接丢弃。
- 消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息被成功消费。
- Redis5.0新增了Stream数据类型,不但支持多播,还支持数据持久化,比发布/订阅更加强大。