Redis 消息队列介绍

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

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数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
13天前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
50 6
|
3月前
|
消息中间件 存储 负载均衡
Redis使用ZSET实现消息队列使用总结二
Redis使用ZSET实现消息队列使用总结二
66 0
|
1月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
84 20
剖析 Redis List 消息队列的三种消费线程模型
|
14天前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
20 2
|
14天前
|
消息中间件 存储 NoSQL
python 使用redis实现支持优先级的消息队列详细说明和代码
python 使用redis实现支持优先级的消息队列详细说明和代码
29 0
|
2月前
|
消息中间件 NoSQL Redis
Redis Stream消息队列之基本语法与使用方式
这篇文章详细介绍了Redis Stream消息队列的基本语法和使用方式,包括消息的添加、读取、删除、修剪以及消费者组的使用和管理,强调了其在消息持久化和主备复制方面的优势。
55 0
|
3月前
|
消息中间件 存储 NoSQL
Redis使用ZSET实现消息队列使用总结一
Redis使用ZSET实现消息队列使用总结一
93 0
|
17天前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
53 1
|
17天前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
33 2
数据的存储--Redis缓存存储(二)