开发者社区> 卢子召> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Redis消息队列

简介: Redis的消息队列使用简单,没有什么配置,比ActiveMQ要轻量级太多,当然功能也比较简单,如果只需要简单的订阅以及发布,可以考虑使用它。 订阅操作 命令为:subscribe [channel] [channel] ..,如【代码1】所示,即成功订阅频道[redis.blog]。 发布操作 命令为publish [channel] [message],如【代码2
+关注继续查看

Redis的消息队列使用简单,没有什么配置,比ActiveMQ要轻量级太多,当然功能也比较简单,如果只需要简单的订阅以及发布,可以考虑使用它。

订阅操作

命令为:subscribe [channel] [channel] ..,如【代码1】所示,即成功订阅频道[redis.blog]。

发布操作

命令为publish [channel] [message],如【代码2】所示,【图1】为订阅的客户端展示效果。
【代码1】:

subscribe "redis. blog"

【代码2】

publish "redis.blog" "hello redis"

【图1】
图1

退订操作

命令为:unsubscribe [channel] [channel] ..,如【代码3】所示。
【代码3】

unsubscribe "redis.blog"

模式订阅

命令为:psubscribe [pattern] [pattern]…,如【代码4】所示,如果发布的消息符合当前订阅的模式,亦会收到消息通知,如【图2】所示。
【代码4】

psubscribe "redis.*"

【图2】
这里写图片描述

模式退订
命令为:punsubscribe [pattern] [pattern]…,如【代码5】所示。
【代码5】

punsubscribe "redis.*"

数据结构
关于频道以及模式,redis通过两个struct实现,在redisServer中是如下定义的:

struct rediServer{
    dict *pubsub_channels;
    list *pubsub_patterns;
}

频道是一个dict,pubsub_channels中key为频道名称,value为一个list,list中存储了所有订阅当前频道的client机器;
订阅:如果当前频道还不存在,则subscribe操作即为一次dictAdd操作,如果存在,则相当于将当前的client append到当前channel对应的value list中;
退订:从dict中get(channel)获得list,从list中删除当前client,如果删除后list为空,则表示当前频道已经没有订阅者了,此时将会删除当前channel。

模式是一个list,list中每个node为一个pubsubPattern结构,定义如下:

typedef struct pubsubPattern{
redisClient *client;
robj *pattern;
} 

订阅模式:即是在当前list队尾插入一个pubsubPattern;
退订模式:则是遍历list删除匹配节点的过程。
即使不同client订阅同一个模式,也是两个不同的node,或者同一个client订阅2个不同模式,亦为两个node,这一点从pubsubPattern的数据结构上能看出来。

发送消息
发布一条信息,redis服务器会执行2个操作:

  • 将消息发送给相应频道的所有订阅者,具体操作为:
    以当前频道为key,在当前pubsub_channels字典中找到对应的value,value为一个订阅者list,遍历该list,将消息发送给所有的订阅者;
  • 将消息发送给与当前频道相匹配的所有模式,具体操作为:
    以当前频道为key,在当前pubsub_patterns列表中遍历所有节点,如果某个节点(pubsubPattern)的pattern值和key匹配,则将消息发送给当前节点的client,遍历结束为止。

另外的三个命令

  • pubsub channels:查看当前所有频道;也可以使用通配,返回所有匹配的平道(pubsub channels “redis.*”);
  • pubsub numsub: 接收任意多个频道作为输入参数,返回这些频道的订阅者数量;
  • pubsub numpat:返回服务器当前被订阅模式的数量;

至于如何将发布的消息及时反馈给所有订阅者,redis是通过服务器的文件事件来操作的,不单单是消息队列功能,所有的get,set操作都是通过文件事件(file event)来驱动的,事件会单独开一篇来介绍。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Redis之集群环境搭建
前面文章介绍了Redis的主从复制,虽然该模式能够在一定程度上提高系统的稳定性,但是在数据访问量比较大的情况下,单个master应付起来还是比较吃力的,这时我们可以考虑将redis集群部署,本文就来重点给大家介绍下Redis的集群部署操作。
129 0
Redis 复制与集群

复制

为提高高可用性,排除单点故障,redis支持主从复制功能。
其整体结构是一个有向无环图。

同步方式

分为两种:

  • 全同步
    全同步是第一次从机连主机是进行的同步,主机会生
2089 0
+关注
卢子召
但行好事,莫问前程!
27
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载