[一]任务队列的好处

--->松耦合:生产者和消费者无需知道彼此实现的细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写。

--->易于扩展:消费者可以有多个,而且可以分布在不同的机器。可以轻易降低单台服务器的负载。

 

[二]使用redis实现简单的任务队列(生产者消费者模型)

--->根据列表类型的存储结构实现队列

--->生产者命令:LPUSH key value[value ...] RPUSH key value[value...]

--->消费者命令:RPOP key 或BRPOP key timeout ,  LPOP key 或者 BLPOP key timeout

--->阻塞消费者命令:timeout 为0时,不设置超时时间,一直等待,直到有消息。如果设置数字,则单位为秒。

redis消息中间件 redis 中间件_redis消息中间件

 

[三]使用redis实现优先级队列(生产者消费者模型)

--->设置多个任务队列,生产者按任务的优先级,将任务发往不同的队列

--->消费者订阅多个队列,队列的顺序:按优先级由高到低,从左侧往右侧排序。

--->结果现象:消费者每次取消息,都是从左侧往右侧取。先把优先级高的队列中任务消费完毕,才去消费优先级低的队列中的任务。实例:如下图

redis消息中间件 redis 中间件_redis消息中间件_02

 

[四]使用redis实现发布订阅模型(广播模型)

--->发布者往redis中的channel发布一条消息x,所有订阅该channel的订阅者都可以得到这条消息x

--->发布者命令:PUBLISH channel message

--->订阅者命令:SUBSCRIBE channel [channel]

--->PUBLISH命令发布消息后,返回值表示,订阅到该消息的订阅者数量。如果返回0,表示无人订阅,消息不会持久化,会随即消失。后面及时有订阅者订阅了该频道,也无法订阅到之前该发布者发布的历史消息。

--->执行SUBSCRIBE命令后,客户端会进入订阅状态。处于此状态的客户端不能使用除SUBSCRIBE,UNSUBSCRIBE,PSUBSCRIBE,PUNSUBSCRIBE这四个属于“发布订阅”模式的命令之外的命令。否则会报错

--->SUBSCRIBE命令执行后,会返回三个值。第一个值是消息的类型。根据消息类型的不同,第二个,第三个值也会不同

(1)消息类型包含

=>subscibe,表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。

=>message,这个类型的回复是我们最关心的,它表示接收到消息。第二个值标示产生消息的频道名称,第三个值是消息的内容

=>unsubscribe.这个类型的回复表示成功取消订阅某个频道,第二个值对应的频道名称,第三个值是当前客户端订阅的频道数量。当此值返回0时,当前客户端会退出订阅状态。之后可以执行其他非“发布订阅”模式的命令。

redis消息中间件 redis 中间件_发布订阅_03

[五]发布订阅模型:按照规则订阅

--->按规则订阅通道的语法

符号

含义

?

匹配一个字符

*

匹配任意个(包括0个)字符

[]

匹配括号间的任一字符,可以使用“-”符号表示一个范围。如[a-z][1-9]

\x

匹配字符x,用于转义符号。如果匹配“?”就需要使用\?

--->命令格式:PUSBSCRIBE  channelpattern[channelpattern...]

--->返回值四个值。

  (1)pmessage:表示是通过PUSBSCRIBE命令订阅频道接收到的。

  (2)channelpattern:表示是订阅时使用的是那个通配符

  (3)channelName:表示实际收到消息的频道命令

  (4)messageContext:表示收到消息的内容

--->使用PUSBSCRIBE命令可以重复订阅一个频道。比如客户端执行了。PUSBSCRIBE chanel.? channel.?*  那么这个时候向channel.2发送消息,则该订阅客户端将收到两条消息。同样如果客户端使用PUSBSCRIBE channel.10 channel.?* 订阅消息。则往channle1.10发送消息,该订阅客户端也会收到两条消息。但消息类型是两种message合pmessage。

redis消息中间件 redis 中间件_优先级_04

 

 

[六]发布订阅模型:退订规则

--->通过匹配订阅的退订命令格式:PUNSUBSCRIBE [pattern [pattern ...]]

--->直接订阅的退订的命令格式:UNSUBSCRIBE [channel [channel ...]]

--->使用PUNSUBSCRIBE命令只能退订通过PSUBSCRIBE命令订阅规则。不会影响直接通过SUBSCRIBE命令订阅的频道

--->同样UNSUBSCRIBE命令也不会影响同过PSUBSCRIBE命令的订阅的频道。

--->容易错误的点:PUNSUBSCRIBE命令退订某个规则时,不会将匹配符号的命令规则展开。比如:用PUNSUBSCRIBE *是无法退订channel.*。而是必须使用PUNSUBSCRIBE channel.*才能退订channel.*