Redis 发布订阅模式(7)

列表的局限

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

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

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

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

发布订阅模式

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

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

订阅频道

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

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

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

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

1127.0.0.1:6379> subscribe topic1 topic2 topic3 2Reading messages... (press Ctrl-C to quit) 31) "subscribe" 42) "topic1" 53) (integer) 1 61) "subscribe" 72) "topic2" 83) (integer) 2 91) "subscribe" 102) "topic3" 113) (integer) 3

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

1127.0.0.1:6379> publish topic1 222222 2(integer) 1 3 4### 消息订阅方收到的信息 5 61) "message" 72) "topic1" 83) "222222"

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

unsubscribe topic1

按规则(Pattern)订阅频道

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

1消费端(订阅方) 2psubscribe news* 3psubscribe news-word 4psubscribe *message 5 6生产者(发布方) 7publish news-word1 111111 8publish news-message 1111 9publish sms-message 1111

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移

Redis 发布订阅模式(7) - HelloWorld