前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 发布订阅模式(7)

Redis 发布订阅模式(7)

作者头像
兜兜毛毛
发布2020-03-19 10:38:13
5260
发布2020-03-19 10:38:13
举报
文章被收录于专栏:兜兜毛毛兜兜毛毛

列表的局限

前面我们说通过队列的rpush和lpop可以实现消息队列(队尾进队头出),但是消费者需要不停地调用lpop查看List中是否有等待处理的消息(比如写一个while循环)。为了减少通信的消耗,可以sleep()一段时间再消费,但是会有两个问题:

1、如果生产者生产消息的速度远大于消费者消费消息的速度,List会占用大量的内存。

2、消息的实时性降低。list还提供了一个阻塞的命令:blpop,没有任何元素可以弹出的时候,连接会被阻塞。

基于list实现的消息队列,不支持一对多的消息分发。

发布订阅模式

除了通过list实现消息队列之外,Redis还提供了一组命令实现发布/订阅模式。

这种方式,发送者和接收者没有直接关联(实现了解耦),接收者也不需要持续尝试获取消息。

订阅频道

首先,我们有很多的频道(channel),我们也可以把这个频道理解成queue。订阅者可以订阅一个或者多个频道。消息的发布者(生产者)可以给指定的频道发布消息。只要有消息到达了频道,所有订阅了这个频道的订阅者都会收到这条消息。

需要注意的注意是,发出去的消息不会被持久化,因为它已经从队列里面移除了,所以消费者只能收到它开始订阅这个频道之后发布的消息。

下面我们来看一下发布订阅命令的使用方法。

订阅者订阅频道:可以一次订阅多个,比如这个客户端订阅了3个频道。

代码语言:javascript
复制
127.0.0.1:6379> subscribe topic1 topic2 topic3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "topic1"
3) (integer) 1
1) "subscribe"
2) "topic2"
3) (integer) 2
1) "subscribe"
2) "topic3"
3) (integer) 3

发布者可以向指定频道发布消息(并不支持一次向多个频道发送消息):

代码语言:javascript
复制
127.0.0.1:6379> publish topic1 222222
(integer) 1

### 消息订阅方收到的信息

1) "message"
2) "topic1"
3) "222222"

取消订阅(不能在订阅状态下使用):

代码语言:javascript
复制
unsubscribe topic1
按规则(Pattern)订阅频道

支持?和*占位符。?代表一个字符,*代表0个或者多个字符。

代码语言:javascript
复制
消费端(订阅方)
psubscribe news* 
psubscribe news-word 
psubscribe *message

生产者(发布方)
publish news-word1 111111
publish news-message 1111
publish sms-message 1111

注意:Redis无法保证消息的可靠投递,当发送的消息没有接收方时,会造成数据丢失。正式环境建议使用专业MQ。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 发布订阅模式
    • 订阅频道
      • 按规则(Pattern)订阅频道
      相关产品与服务
      消息队列 CMQ 版
      消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档