Redis之发布订阅

news/2024/10/5 17:21:26

发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。

消息发送者&消息接收者&频道

可以想象这么一个场景。我们抖音、微博关注了哪个博主,当他发布一条文章时,系统就会给我们推送他发布的消息内容。
此时,博主=消息发送者,我们用户=消息订阅者,我们关注博主的这个动作=订阅频道。
当然像抖音等这种大型复杂的功能用redis来实现有些吃力,只能说redis可以实现这么一个功能,一般都会用专门的MQ,像rabbitmq、kafka等。

订阅频道

SUBSCRIBE命令:可以让客户端订阅任意数量的频道,每当有新消息发送到被订阅的频道时,信息就会发送给订阅这个频道的所有客户端。
命令格式:SUBSCRIBE [频道1名称] [频道2名称]

消息传送过程

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

当有新消息通过 publish 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

为什么要用发布订阅?

熟悉消息中间件的同学都知道,针对消息订阅发布功能,市面上很多大厂使用的是kafka、RabbitMQ、ActiveMQ, RocketMQ等这几种。
redis的订阅发布功能跟这三者相比,相对轻量,针对数据准确和安全性要求没有那么高可以直接使用,适用于小公司。

redis 的List数据类型结构提供了 blpop 、brpop 命令结合 rpush、lpush 命令可以实现消息队列机制,基于双端链表实现的发布与订阅功能

  • 双端队列图解

双端队列模式只能有一个或多个消费者轮着去消费,却不能将消息同时发给其他消费者

  • 发布/订阅模式图解

redis订阅发布模式,生产者生产完消息通过频道分发消息,给订阅了该频道的所有消费

发布/订阅如何使用?

Redis有两种发布/订阅模式

  • 基于频道(Channel)的发布/订阅
  • 基于模式(pattern)的发布/订阅
序号 命令 描述
1 subscribe channel [channel ... ] 订阅给定的一个或多个频道
2 unsubscribe  channel  [channel ... ] 退订给定的频道,说明:若没有指定channel,则默认退订所有频道
3 publish channel message 将消息发送给指定频道 channel,返回结果:接收到信息的订阅者数量,无订阅者返回0
4 pubsub channels [argument  [atgument ...] ] 查看订阅与发布系统的状态,说明:返回活跃频道列表(即至少有一个订阅者的频道,订阅模式的客户端除外)
5 psubscribe pattern1  [pattern...] 订阅一个或多个符合给定模式的频道,说明:每个模式以 * 作为匹配符;例如 cn* 匹配所有以cn开头的频道:cn.java、cn.csdn
6 punsubscribe [pattern [pattern ...] ] 退订所有给定模式的频道,说明:pattern 未指定,则订阅的所有模式都会被退订,否则只退订指定的订阅的模式

案例

  • 开启一个终端,订阅一个频道(订阅端)
127.0.0.1:6379> SUBSCRIBE weibo                     #订阅一个频道,频道的名字weibo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weibo"
3) (integer) 1                                      #等待读取推送的信息
  • 另起一个终端发送消息(发送端)
127.0.0.1:6379> PUBLISH weibo "hello weibo"         #发布者发送消息到频道
(integer) 1
127.0.0.1:6379> PUBLISH weibo "hello redis"
(integer) 1
127.0.0.1:6379>
  • 第一个终端收到消息
127.0.0.1:6379> SUBSCRIBE weibo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weibo"
3) (integer) 1
1) "message"                                       #消息
2) "weibo"                                         #来自哪个频道
3) "hello weibo"                                   #消息的内容
1) "message"
2) "weibo"
3) "hello redis"

参考

https://blog.csdn.net/w15558056319/article/details/121490953
https://blog.csdn.net/yi_qingjun/article/details/128172464

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/43209.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

DBAPI 安装部署standalone 数据API接口发布平台

DBAPI 项目地址:https://gitee.com/freakchicken/db-api 项目简介:零代码开发api服务,只需编写sql,就可以生成http api服务。支持api动态创建,兼容多种数据库。 适用于BI报表、数据可视化大屏的后端接口快速开发。 旨在为企业数据服务的发布提供完整解决方案 一、下载安装…

wu

转载自 他是 ISIJ 第四名,也是在线知名题库的洛谷“网红”。 2024年全国青少年信息学奥林匹克竞赛冬令营(WC)上,以优秀成绩斩下第一名年仅六年级的 $liuyi0905$,成为最夺目的选手之一。 而且虽然是六年级的选手,但他取得优异成绩后,不少网友并不感到陌生,纷纷留言: 这…

如何阅读MTF图表

前言 1943年——就在二战方酣的困顿时期——蔡司(Zeiss)发展出一套称为「调制传递函数」(德:Modulationsbertragungsfunktion;英:Modulation Transfer Function, MTF;日:変调伝达关数)的科学程序,用来评量镜头的影像品质。光学仪器业者、相机镜头制造商欣然拥抱这项新…

openGauss-1主2从1级联回切

假设omm1 omm2 omm4 是idc1,omm3 是idc2 模拟IDC1 全挂:手动将级联节点提升为主:此时idc1正常了,需要加回集群: Omm1 buildOmm2 buildOmm4 build 之后启omm3 的crontab,靠cm去选主检查新主的数据:注意点: CM 起来后不能build了,所以要先build再启CM本文来自博客园,作者…

实例:vue

实例:vue.js实现模态窗口(弹窗)| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| -----…

同步mysql数据到ElasticSearch的最佳实践

同步mysql数据到ElasticSearch的最佳实践| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| ------------…

开源无代码 / 低代码平台 NocoBase 1.0.1-alpha.1: 区块支持高度设置

NocoBase 是一个极易扩展的开源无代码开发平台。完全掌控,无限扩展,助力你的开发团队快速响应变化,显著降低成本,不必投入几年时间和数百万资金研发,只需要花几分钟部署 NocoBase。 NocoBase 中文官网 官方文档 在线 Demo 新特性 区块支持高度设置(#4441)参考文档:区块…

Apifox安装使用

下载双击安装登录后,查看本地Mock快捷请求测试复制url到浏览器测试