Redis实战(12)订阅和发布消息

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。pub/sub不仅仅解决发布者和

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的
耦合,这点和设计模式中的观察者模式比较相似。pub/sub 不仅仅解决发布者和订阅者直接
代码级别耦合也解决两者在物理部署上的耦合。redis 作为一个pub/sub 的server,在订阅者
和发布者之间起到了消息路由的功能。订阅者可以通过subscribe 和psubscribe 命令向redis
server 订阅自己感兴趣的消息类型,redis 将消息类型称为通道(channel)。当发布者通过
publish 命令向redis server 发送特定类型的消息时。订阅该消息类型的全部client 都会收到
此消息。这里消息的传递是多对多的。一个client 可以订阅多个channel,也可以向多个channel
发送消息。
下面做个实验。这里使用3 不同的client, client1 用于订阅tv1 这个channel 的消息,client2
用于订阅tv1 和tv2 这2 个chanel 的消息,client3 用于发布tv1 和tv2 的消息。

Client1:

自由画布 自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

自由画布 73 查看详情 自由画布

212155349.png

Client2:

212226969.png

Client3:

212314958.png

下面看Client1和Client2的接收情况:

212435865.png

212504435.png

Client1和Client2都收到了tv1的消息,然后我们再使用Client3发布一条消息:

212623854.png

看看Clien1,Client2的接收情况

212728278.png

212801287.png

下面将详细的解释一下上面的例子
1、client1 订阅了tv1 这个channel 这个频道的消息,client2 订阅了tv1 和tv2 这2 个频道的
消息
2、client3 是用于发布tv1 和tv2 这2 个频道的消息发布者
3、接下来我们在client3 发布了一条消息”publish tv1 program1”,大家可以看到这条消息是
发往tv1 这个频道的
4、理所当然的client1 和client2 都接收到了这个频道的消息
5、 然后client3 又发布了一条消息”publish tv2 program2”,这条消息是发往tv2 的,由于
client1 并没有订阅tv1,所以client1 的结果中并没有显示出任何结果,但client2 订阅了这个
频道,所以client2 是会有返回结果的。
我们也可以用psubscribe tv*的方式批量订阅以tv 开头的频道的内容。
看完这个小例子后应该对pub/sub 功能有了一个感性的认识。需要注意的是当一个连接通过
subscribe 或者psubscribe 订阅通道后就进入订阅模式。在这种模式除了再订阅额外的通道或
者用unsubscribe 或者punsubscribe 命令退出订阅模式,就不能再发送其他命令。另外使用
psubscribe 命令订阅多个通配符通道,如果一个消息匹配上了多个通道模式的话,会多次收
到同一个消息。

 

Pipeline 批量发送请求

redis 是一个cs 模式的tcp server,使用和http 类似的请求响应协议。一个client 可以通过一
个socket 连接发起多个请求命令。每个请求命令发出后client 通常会阻塞并等待redis 服务
处理,redis 处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下:

Client: INCR XServer: 1Client: INCR XServer: 2Client: INCR XServer: 3Client: INCR XServer: 4

 

基本上四个命令需要8 个tcp 报文才能完成。由于通信会有网络延迟,假如从client 和server
之间的包传输时间需要0.125 秒。那么上面的四个命令8 个报文至少会需要1 秒才能完成。
这样即使redis 每秒能处理100 个命令,,而我们的client 也只能一秒钟发出四个命令。这显
示没有充分利用redis 的处理能力,怎么样解决这个问题呢? 我们可以利用pipeline 的方式
从client 打包多条命令一起发出,不需要等待单条命令的响应返回,而redis 服务端会处理
完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下

Client: INCR XClient: INCR XClient: INCR XClient: INCR XServer: 1Server: 2Server: 3Server: 4

 

假设不会因为tcp 报文过长而被拆分。可能两个tcp 报文就能完成四条命令,client 可以将四
个incr 命令放到一个tcp 报文一起发送,server 则可以将四条命令的处理结果放到一个tcp
报文返回。通过pipeline 方式当有大批量的操作时候,我们可以节省很多原来浪费在网络延
迟的时间,需要注意到是用pipeline 方式打包命令发送,redis 必须在处理完所有命令前先缓
存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令
越多越好。具体多少合适需要根据具体情况测试。

具体是否使用pipeline 必须要基于大家手中的
网络情况来决定,不能一切都按最新最好的技术来实施,因为它有可能不是最适合你的。

 

 

本文出自 “phper-每天一点点~” 博客,请务必保留此出处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/537501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 13:22:32
下一篇 2025年11月9日 13:28:00

相关推荐

  • Redis3.2开启远程访问详细步骤

    redis是一个开源的使用ansi c语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api。redis支持远程访问,详细步骤小编已为大家整理出来了,具体步骤如下: redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf打开r…

    好文分享 2025年12月24日
    000
  • Redis配置文件redis.conf详细配置说明

    本文列出了redis的配置文件redis.conf的各配置项的详细说明,简单易懂,有需要的盆友可以参考哦。 redis.conf 配置项说明如下 redis配置文件详解 # vi redis.confdaemonize yes #是否以后台进程运行pidfile /var/run/redis/red…

    好文分享 2025年12月24日
    000
  • Flask应用中动态图片更新与上传教程

    本教程详细介绍了如何在flask web应用中展示静态图片,并通过%ignore_a_1%实现图片的定时刷新,解决浏览器缓存问题。同时,文章还涵盖了如何在flask后端处理图片上传,并将其与前端展示及刷新机制相结合,提供了一个完整的图片管理与动态显示解决方案。 1. Flask应用中静态图片的基本展…

    2025年12月23日 好文分享
    000
  • PHP 多语言网站切换:会话管理与翻译函数实践

    本教程详细介绍了使用 php 构建多语言网站的实现方法。文章涵盖了如何通过 url 参数和会话管理实现语言切换,以及如何设计一套健壮的翻译加载与显示机制,以避免常见的变量未定义和字符串偏移错误。通过封装的辅助函数,确保翻译内容正确加载和渲染,提升代码的可维护性和用户体验。 构建多语言网站的核心挑战 …

    2025年12月23日
    300
  • 将独立Python逻辑集成到Django Web应用:以计时器项目为例

    本教程旨在指导初学者如何将一个独立的Python命令行计时器应用改造并集成到Django Web项目中。文章将详细介绍如何通过Django的视图、表单和模板机制处理用户输入、执行核心Python逻辑,并最终在HTML页面上展示结果,同时探讨将命令行应用特性迁移到Web环境的关键考量。 理解从命令行到…

    2025年12月23日
    000
  • 如何将Python后端逻辑与Django和HTML进行集成

    本教程旨在指导初学者如何将独立的Python命令行应用程序转换为基于Django的Web应用。文章将详细阐述如何通过Django的视图、URL配置和表单系统,将Python逻辑与HTML前端进行交互,实现用户输入捕获和结果展示。重点在于重构Python代码以适应Web环境,并利用Django For…

    2025年12月23日
    000
  • 将Python命令行应用集成到Django Web项目:以计时器为例

    本文将指导您如何将一个独立的python命令行计时器应用程序改造并集成到django web项目中。我们将详细介绍如何利用django的视图、模板和表单系统来捕获用户输入,并将原有的python逻辑适配到web环境,同时探讨在web应用中处理后台任务和用户通知的策略,帮助初学者顺利过渡。 从命令行到…

    好文分享 2025年12月23日
    000
  • 部署与调度Node.js爬虫:从本地执行到云端集成

    本教程详细指导如何部署和调度一个基于node.js的网页爬虫,使其能够每日自动运行并将其数据提供给前端应用。文章将区分客户端与服务器端javascript的运行环境,介绍本地任务调度方法,并探讨将爬虫集成到在线服务以实现数据共享的策略,同时涵盖数据持久化、cors处理及部署最佳实践。 1. 理解No…

    2025年12月23日
    000
  • HTML5WebSocket怎么通信_HTML5WebSocket实现实时通信的原理与代码

    WebSocket基于TCP实现全双工通信,通过HTTP握手升级协议后进行持久化双向数据传输,适用于聊天、通知等高频交互场景;前端使用JavaScript的WebSocket API建立连接并监听事件,后端可用Node.js的ws库创建服务器;需注意代理配置、自动重连、JSON格式消息及安全认证等问…

    2025年12月23日
    000
  • 实现实时UI更新:利用SSE与WebSocket告别传统轮询

    本文探讨了如何在不依赖传统http轮询的情况下,实现用户界面(ui)的实时动态更新,尤其适用于聊天应用中的用户活动状态显示。文章详细介绍了两种主流技术:服务器发送事件(sse)和websocket,并阐明了它们的工作原理、适用场景及选择依据。通过采用这些技术,服务器能够主动向客户端推送数据,从而避免…

    好文分享 2025年12月23日
    000
  • HTML5在线如何实现实时视频聊天 HTML5在线通信功能的开发方法

    实现实时视频聊天主要依赖WebRTC技术,1. 通过getUserMedia获取音视频流,RTCPeerConnection建立P2P连接,RTCDataChannel传输数据;2. 使用Node.js+Socket.IO搭建信令服务器交换SDP与ICE信息;3. 借助STUN/TURN服务器穿透N…

    2025年12月23日
    000
  • Web内容访问控制:用户认证、会话管理与数字版权保护(DRM)

    本文旨在提供一个全面的指南,介绍如何在web应用中实现基于用户登录状态的内容访问控制。我们将详细探讨利用会话和cookie进行用户认证的机制,包括登录流程、会话管理及安全性考量。此外,文章还将深入讨论数字版权管理(drm)技术,如widevine、playready和fairplay,以应对视频内容…

    2025年12月23日
    000
  • 如何实现HTML在线实时聊天_HTML在线实时聊天功能实现与消息推送方案

    核心是WebSocket实现双向通信,替代传统HTTP轮询;前端用JavaScript创建连接并监听消息,后端如Node.js或Spring Boot提供支持;备选方案包括SSE和长轮询;配合心跳、重连、消息队列等机制保障稳定性。 要在HTML网页上实现在线实时聊天,核心是解决消息的即时推送问题。传…

    2025年12月23日
    000
  • Discord用户头像链接的动态获取与持久性挑战

    本文探讨了discord用户头像链接的持久性问题。由于discord为上传图片生成随机url,直接获取一个“始终更新且链接不变”的用户头像链接是不可行的。唯一可靠的方法是通过discord api动态获取用户的最新头像url,并利用其用户id作为稳定标识符。 Discord用户头像URL的本质与限制…

    2025年12月23日
    000
  • HTML表单重复提交漏洞怎么避免_表单重复提交导致数据异常漏洞避免方法

    答案:避免HTML表单重复提交需前端禁用按钮、后端令牌验证与幂等设计、数据库唯一约束协同防御。 HTML表单重复提交,这事儿说起来挺头疼的,因为它不仅影响用户体验,更可能直接导致数据异常,比如订单重复创建、支付重复扣款,甚至一些敏感操作被多次执行。在我看来,避免这类漏洞,本质上是一场客户端与服务器端…

    2025年12月23日
    000
  • HTML数据如何实现实时采集 HTML数据流式处理的架构设计

    答案:构建低延迟、高吞吐的实时HTML流处理系统需分四步:1. 采集层用轻量HTTP或无头浏览器动态抓取,结合增量识别与分布式集群提升效率;2. 解析层采用流式解析器与规则抽取,提取结构化数据并容错降级;3. 流架构通过消息队列解耦,接入Flink等引擎做实时计算与多端输出;4. 保障层实现重试、限…

    2025年12月23日
    000
  • HTML数据如何实现分布式采集 HTML数据分布式爬虫的架构设计

    答案:构建分布式HTML采集系统需整合任务调度、去重、存储与监控模块,以Redis为核心协调任务分发与去重,通过消息队列实现负载均衡,结合布隆过滤器减少重复抓取,利用无状态工作节点支持弹性扩展,依托ZooKeeper保障高可用,并集成反爬适配与请求控制机制,确保系统稳定高效运行。 要实现HTML数据…

    好文分享 2025年12月23日
    000
  • HTML数据如何构建数据API HTML数据接口的开发与部署

    答案:将HTML转为API需先解析稳定结构化数据,再用Flask等框架提供JSON接口。1. 确认HTML有清晰标签与更新规律;2. 用Python爬取并解析页面,封装为REST API;3. 部署至云服务器或Serverless平台;4. 加缓存、设请求头、控频次以提升稳定性。 直接把HTML数据…

    2025年12月23日
    000
  • HTML数据如何实现批量下载 HTML数据批量采集的自动化方案

    实现HTML数据批量下载需构建自动化流程,核心是模拟访问、提取内容、结构化存储。1. Python+Requests+BeautifulSoup适合中小规模,通过requests获取页面,BeautifulSoup解析并保存为CSV/JSON。2. 动态页面用Selenium或Playwright,…

    2025年12月23日
    000
  • HTML数据如何实现数据服务 HTML数据服务化的架构模式

    HTML数据服务化是将网页中的结构化信息提取并转为API服务的过程。1. 通过爬虫技术解析DOM,利用CSS选择器或XPath定位目标数据,并进行清洗与格式标准化;2. 将清洗后数据封装为JSON等格式,设计RESTful接口支持分页与查询;3. 构建中间层服务,采用缓存、定时任务和微服务提升稳定性…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信