Redis 的发布与订阅

3、Redis 的发布与订阅

3.1、发布与订阅简述

Redis提供了基于“发布/订阅”模式的消息机制。此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道(channel) 发布消息,订阅该频道的每个客户端都可以收到该消息,如图1所示。Redis提供了若干命令支持该功能,在实际应用开发时,能够为此类问题提供实现方法。

Redis 的发布与订阅_第1张图片

3.2、发布与订阅架构

Redis 提供了发布订阅功能,可以用于消息的传输,Redis 的发布订阅机制包括三个部分:发布者,订阅者和 Channel。

发布者和订阅者都是 Redis 客户端,Channel 则为 Redis 服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。

Redis 的这种发布订阅机制与基于主题的发布订阅类似,Channel 相当于主题。

1、客户端可以订阅频道如下图

Redis 的发布与订阅_第2张图片

2、当给这个频道发布消息后,消息就会发送给订阅的客户端

Redis 的发布与订阅_第3张图片

3.3、使用场景

聊天室、公告牌、服务之间利用消息解耦都可以使用发布订阅模式。

下面以简单的服务解耦进行说明。如图2所示,图中有两套业务,上面为视频管理系统,负责管理视频信息;下面为视频服务面向客户,用户可以通过各种客户端(手机、 浏览器、 接口) 获取到视频信息。

Redis 的发布与订阅_第4张图片

假如视频管理员在视频管理系统中对视频信息进行了变更,希望及时通知给视频服务端,就可以采用发布订阅的模式,发布视频信息变化的消息到指定频道,视频服务订阅这个频道及时更新视频信息,通过这种方式可以有效解决两个业务的耦合性。

3.4、发布与订阅命令

3.4.1、订阅消息

127.0.0.1:6379> subscribe channel [channel ...]
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel"
3) (integer) 1		# 返回值为当前已订阅的频道数量

# 以下是客户端接收到的订阅消息
1) "message"
2) "channel"
3) "hello"

3.4.2、发布消息

127.0.0.1:6379> publish channel "hello"
(integer) 1		# 返回值为订阅当前频道的客户端数量

3.4.3、按模式订阅频道

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

每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、news.global.today 等),诸如此类。

3.4.4、退订频道

127.0.0.1:6379> unsubscribe pattern [pattern ...]
# 返回值为当前客户端订阅的频道和模式的数量

3.4.4、按模式退订频道

127.0.0.1:6379> punsubscribe pattern [pattern ...]
# 返回值为当前客户端订阅的频道和模式的数量

有关订阅命令有两点需要注意:

  1. 客户端在执行订阅命令之后进入了订阅状态,只能接收 subscribe、psubscribe、 unsubscribe、 punsubscribe 的四个命令。
  2. 新开启的订阅客户端,无法收到该频道之前的消息,因为 Redis 不会对发布的消息进行持久化。

3.5、Redis发布订阅与ActiveMQ的比较

  1. ActiveMQ 支持多种消息协议,包括 AMQP,MQTT,Stomp 等,并且支持 JMS 规范,但 Redis 没有提供对这些协议的支持;
  2. ActiveMQ 提供持久化功能,但 Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
  3. ActiveMQ 提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis 没有提供消息传输保障。

参考链接:
https://blog.csdn.net/fly910905/article/details/78495971
https://blog.csdn.net/feiying0canglang/article/details/122838728

你可能感兴趣的:(Redis,redis,数据库,缓存)