1.列表list的发布订阅模式的局限性
前面我们说通过队列的rpush 和lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用lpop查看List 中是否有等待处理的消息
(比如写一个 while 循环)。为了减少通信的消耗,可以sleep()一段时间再消费,但是会有两个问题:
1.如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存。
2.消息的实时性降低。
list 还提供了一个阻塞的命令:blpop,没有任何元素可以弹出的时候,连接会被阻塞。
3.基于list 实现的消息队列,不支持一对多的消息分发。
所谓不支持消息分发,就是主动通知的功能;
blpop命令使用参考
http://redisdoc.com/list/blpop.html
2.redis的发布订阅模式
2.1.概述
1.首先,我们有很多的频道(channel),我们也可以把这个频道理解成queue队列。
2.订阅者可以订阅一个或者多个频道。消息的发布者(生产者)可以给指定的频道发布消息。只要有消息到达了频道,
所有订阅了这个频道的订阅者都会收到这条消息。
3.需要注意的注意是,发出去的消息不会被持久化,因为它已经从队列里面移除了,所以消费者只能收到它开始订阅这个频道之后发布的消息。
2.2.相关命令
2.2.1.客户端订阅频道消息
2.2.1.1.完全匹配:subscribe name
127.0.0.1:6379> SUBSCRIBE name
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "name"
3) (integer) 1
2.2.1.2.规则匹配:支持?和*占位符。?代表一个字符,*代表 0 个或者多个字符。
一定要注意,规则匹配不是SUBSCRIBE而是PSUBSCRIBE
2.2.1.2.1.规则匹配 ?代表一个字符:PSUBSCRIBE ?ame
客户端A
127.0.0.1:6379> PSUBSCRIBE ?ame
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "?ame"
3) (integer) 1
1) "pmessage"
2) "?ame"
发布端B
127.0.0.1:6379> publish name gaoxinfu
(integer) 4
127.0.0.1:6379>
上面发布端B执行完成之后,客户端A会有如下变化
127.0.0.1:6379> PSUBSCRIBE ?ame
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "?ame"
3) (integer) 1
1) "pmessage"
2) "?ame"
3) "name"
4) "gaoxinfu"
2.2.1.2.2.规则匹配 *代表 0 个或者多个字符:PSUBSCRIBE *sports
客户端A
localhost:~ gaoxinfu$ /usr/local/bin/redis-cli
127.0.0.1:6379> PSUBSCRIBE *sports
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*sports"
3) (integer) 1
1) "pmessage"
2) "*sports"
发布端B
127.0.0.1:6379> publish football-sports football
(integer) 1
127.0.0.1:6379> publish basketball-sports basketball
(integer) 1
127.0.0.1:6379>
上面发布端B执行完成之后,客户端A会有如下变化
localhost:~ gaoxinfu$ /usr/local/bin/redis-cli
127.0.0.1:6379> PSUBSCRIBE *sports
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*sports"
3) (integer) 1
1) "pmessage"
2) "*sports"
3) "football-sports"
4) "football"
1) "pmessage"
2) "*sports"
3) "basketball-sports"
4) "basketball"
2.2.2.发布者发布频道消息:publish name gaoxinfu
127.0.0.1:6379> publish name gaoxinfu
(integer) 1
127.0.0.1:6379>
消息发布完成之后,订阅消息的接收端,会收到发布的内容
127.0.0.1:6379> SUBSCRIBE name
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "name"
3) (integer) 1
1) "message"
2) "name"
3) "gaoxinfu"
当然上面的客户端,只要订阅了都可以接收到消息内容,所以多个客户端可以同时订阅channel频道