redis之发布订阅模式

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频道

2.2.3.客户端取消订阅频道消息:unsubscribe name (这个不能再订阅的模式去执行)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东山富哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值