讲师中心 微信公众号
AI工具推荐 视频效率加速

Redis怎样处理消息发布时的网络堵塞

大磊姑娘_5650

大磊姑娘_5650

发布时间:2026-03-20 09:23:21

|

1033人浏览过

|

来源于php中文网

原创

Redis publish 本身不堵塞,超时主因是网络延迟、订阅端消费慢或Redis主线程被fork/慢查询等阻塞;客户端socket_timeout无法控制主线程执行耗时,需监控latest_fork_usec、slowlog及CPU使用率,并避免将Pub/Sub用于高可靠场景。

redis怎样处理消息发布时的网络堵塞

publish 命令本身不堵塞,但网络或 Redis 主线程卡住会让它“看起来”超时

Redis 的 publish 是一个 O(1) 纯内存操作,只要 Redis 主线程能响应,它就立刻返回。所谓“堵塞”,99% 不是 publish 自身慢,而是它发出去之后,消息卡在了网络链路、订阅端消费不及时、或者 Redis 自身被其他任务拖住——比如正在 fork 子进程做 AOF 重写,或 CPU 被慢查询占满。

常见错误现象:publish 调用耗时突然从毫秒级飙到几百毫秒甚至秒级;客户端日志里出现连接超时或 write timeout;订阅端收不到消息,但 publish 返回值却是 1(表示成功推送到频道)。

  • 检查 Redis 是否正经历 fork:执行 info stats,看 latest_fork_usec 是否 > 500000(500ms),超过 1s 就非常危险
  • 确认没有大 key 或慢命令在并发执行:slowlog get 5 和 redis-cli --bigkeys 必跑
  • 观察 CPU:用 top -p $(pgrep redis) 看单核是否长期 >95%,Redis 单线程扛不住持续高负载

Python redis-py 客户端的 timeout 设置误区

很多人以为给 redis.Redis(..., socket_timeout=2) 就能控制 publish 超时,其实不对。socket_timeout 只管网络读写阶段,而 publish 的真正耗时发生在 Redis 主线程排队和执行——这个过程不受客户端 timeout 控制。

真正起作用的是 socket_connect_timeout(建连)和 socket_keepalive(保活),但它们不解决主线程阻塞问题。

  • publish 调用后卡住,大概率是 Redis 在处理前面堆积的命令,不是网络断了
  • 若想感知“发布失败”,得靠监控:比如用 redis-cli --stat 观察每秒 command 处理数是否骤降
  • 生产环境建议加一层轻量兜底:记录每次 publish 的耗时,连续 3 次 >200ms 就触发告警,而不是等超时抛异常

订阅端积压导致发布“变慢”的假象

Redis 发布订阅是纯广播机制,不关心订阅者是否在线、是否来得及消费。但如果订阅端处理太慢(比如 Python 里 p.listen() 循环里做了同步 HTTP 请求),它的 socket 接收缓冲区就会堆积,最终触发 TCP 流控——这时 Redis 写 socket 会被内核阻塞,表现为后续所有命令(包括 publish)延迟升高。

这不是 Redis 的 bug,是 TCP 协议层的正常反馈。

  • 用 netstat -s | grep "retransmitted" 查重传包,高重传说明下游网络或消费端有问题
  • 订阅端必须非阻塞处理:收到消息后立即丢进线程池/队列,不要在 listen() 循环里做 I/O
  • 避免用单个订阅连接监听多个高频频道,不同业务频道尽量拆成独立连接,防止单点拖垮

别把 Redis Pub/Sub 当 MQ 用,尤其对可靠性有要求时

Redis 的发布订阅没有消息确认、无持久化、不保证顺序、断连即丢消息。当网络抖动或订阅端重启,中间发布的消息就彻底消失——这时候你再调优 publish 超时也没意义。

如果你需要“至少一次投递”或“消息堆积能力”,publish/subscribe 从设计上就不该是首选。

  • 替代方案:用 LPUSH + BRPOP 模拟队列,消息可落盘、可 ack、可重试
  • 更重场景直接上专业 MQ(Kafka/RocketMQ),Pub/Sub 只适合内部通知、实时广播类低可靠需求
  • 一个典型坑:用 Pub/Sub 实现订单状态推送,结果促销高峰时消费者崩了 2 秒,几百单状态丢失,查日志发现 publish 全成功——其实是设计误用

真正难的从来不是怎么让 publish 更快,而是想清楚:这条消息丢了能不能接受?下游有没有能力跟上节奏?这两个问题没答案,调参和加 timeout 都是白忙。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2326

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

570

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

590

2026.02.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4867

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2188

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3658

2023.08.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4209

2023.11.02

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn