Redis的阻塞

Redis的阻塞

Redis的阻塞问题主要分为内在原因外在原因两大类,以下从这两个维度展开分析:


一、内在原因

1. 不合理使用API或数据结构
  • Redis 慢查询

    • Redis 慢查询的界定

      • 定义:Redis 慢查询指命令执行时间超过预设阈值(默认 10ms)的操作,仅统计命令执行阶段耗时
      • slowlog-log-slower-than​:阈值(单位微秒),默认 10000(10ms),建议调整为 1000(1ms)
      • slowlog-max-len​:慢查询日志队列长度,默认 128,建议提升至 1000+ 避免日志覆盖。
    • 典型慢查询命令及风险场景

      • 高时间复杂度命令(O(N)及以上)

        • 全量遍历类

          • KEYS *​:遍历所有键(复杂度 O(n)),可能引发长时间阻塞。
          • SMEMBERS​:获取集合全部元素(O(n)),百万级数据时耗时显著。
        • 聚合计算类

          • SORT​:排序操作(O(n log n)),大列表排序时性能骤降。
          • ZUNIONSTORE​/SUNION​:多集合交并操作(O(n)),数据量越大耗时越长。
        • 大范围查询类

          • HGETALL​:获取哈希所有字段(O(n)),10MB+ 的 Hash 操作延迟显著。
          • LRANGE 0 -1​:获取列表全部元素(O(n)),可能占用主线程数秒。
        1. BigKey 操作
        • 定义:存储大量数据的 Key(如 10MB Hash、百万元素 List)

        • 典型风险命令

          • DEL​:删除 BigKey 时触发内存回收阻塞(单线程模型下耗时极长)。
          • GET​/SET​:序列化/反序列化大 Value 时耗时增加(如 AOF 重写阶段)。
          • EXPIRE​:对大 Key 设置过期时间可能引发后续淘汰阻塞。
      • 非显式高耗时操作

        • Pipeline 不当使用:一次性发送过多命令导致单次执行时间超过阈值。
        • Lua 脚本阻塞:执行复杂脚本(如循环遍历大数据)时未分批次处理。
        • 事务(MULTI/EXEC) :事务中包含多个高耗时命令时整体被视为慢查询。
    • 排查与优化建议

      • 查看日志

        SLOWLOG GET [n]  # 获取最近 n 条慢查询记录(含命令、耗时、客户端 IP)
        SLOWLOG LEN       # 统计当前日志数量
        

      • 日志字段解析

        • id​:唯一标识
        • timestamp​:执行时间戳
        • duration​:耗时(微秒)
        • command​:完整命令及参数。
      • 优化策略

        • 拆分 BigKey

          • 将大 Hash 拆分为多个子 Key,通过分片降低单次操作负载。
          • 使用 LPOP​/RPOP​ 分批次删除大 List,避免 DEL​ 阻塞。
        • 配置调优

          • 动态调整阈值:CONFIG SET slowlog-log-slower-than 1000​。
          • 禁用高风险命令:通过 rename-command​ 屏蔽 KEYS​。
        • 替换高复杂度命令

          • SCAN​ 替代 KEYS​,HSCAN​ 替代 HGETALL​。
          • 对排序需求改用 ZRANGE​ 或客户端计算。
      • 监控与预警

        • 工具

          • redis-cli --bigkeys​:扫描内存中的 BigKey。
          • Prometheus + Grafana:可视化监控慢查询频率及耗时分布。
        • 告警规则

          • 单命令耗时 > 5ms 时触发告警。
          • 慢查询日志长度连续增长时排查潜在性能瓶颈。

    • 总结:慢查询命令速查表

      命令类型典型命令风险场景优化方案
      全量遍历KEYS *​、SMEMBERS键数量多、集合元素量大改用SCAN​、分片存储
      聚合计算SORT​、ZUNIONSTORE数据量大、多集合操作客户端计算、预聚合
      大范围查询HGETALL​、LRANGE 0 -1Hash/List 体积大分批次获取、压缩存储格式
      BigKey 操作DEL​、GET​(大 Value)内存回收、序列化开销渐进式删除、拆分 Key
2. CPU饱和
  • CPU饱和的定义 :

    • CPU饱和指Redis单核CPU使用率长期接近或达到100%的临界状态。由于Redis采用单线程模型,所有请求由主线程顺序处理,一旦CPU满载会导致命令队列积压、响应延迟暴增,甚至引发服务雪崩。这种现象在高并发或复杂操作场景下尤为危险
  • 判断并发量是否达极限

    • redis-cli --stat​命令分析 每秒输出一次统计信息,重点关注requests​字段(即OPS,每秒操作数)

      redis-cli --stat
      # 典型CPU饱和时的输出特征:
      # 1. 每秒处理请求量持续在5万+(普通服务器极限约8-10万OPS)
      # 2. 客户端连接数(clients)持续高位且无明显波动
      

    • top​命令监控 直接观察Redis进程的CPU使用率

      top -p $(pgrep redis-server)
      # 当CPU使用率≥95%且持续不降时,可判定为饱和状态
      
    • INFO commandstats​分析命令耗时 观察高频命令的usec_per_call​(单次调用微秒数

      cmdstat_hset:calls=198757512,usec=27021957243,usec_per_call=135.95
      # 正常O(1)命令应≤10微秒,若值异常高(如135μs)可能存在配置或数据结构问题
      
  • 问题根源分析

    • 高算法复杂度命令

    • 过度内存优化

      • 修改hash-max-ziplist-entries​等参数过度压缩数据结构,导致操作复杂度从O(1)退化为O(n)
    • 持久化操作竞争

      • Fork阻塞
      • AOF刷盘
    • 连接数过载 : 短连接频繁创建或maxclients​设置过低,导致TCP握手/断连消耗CPU资源

3. 持久化阻塞
  • RDB生成BGSAVE​触发fork操作时,若内存过大(如10GB),复制页表可能导致主线程暂停(典型耗时约20ms/GB)。

  • AOF重写BGREWRITEAOF​期间,主线程需将缓冲区数据追加到新AOF文件,可能因磁盘压力大而阻塞。

    • 优化方案

      • 调整RDB触发频率,避免高峰期执行。
      • 使用appendfsync everysec​替代always​,降低磁盘I/O压力。
      • 关闭透明大页(THP),避免内存页复制效率降低。

二、外在原因

1. CPU竞争
  • Redis部署在多核服务器时,若与其他进程竞争CPU资源,或父子进程(如RDB/AOF重写)绑定同一核心,会导致性能下降。

    • 优化方案

      • 将Redis部署在专用服务器,避免资源争抢。

      • 调整进程绑定策略(如父进程与子进程绑定不同核心)。

        • 错误的现象 :

          flowchart TDsubgraph CPU核心1A[Redis主线程\n(父进程)]B[RDB/AOF子进程]endA -->|fork| BA -->|处理客户端请求\n(高优先级)| C[CPU时间片]B -->|生成快照/重写AOF\n(低优先级)| CC -->|资源抢占| D[响应延迟增加]
          
        • 正确的现象

          flowchart TDsubgraph 物理CPUsubgraph 核心0-3A[Redis主线程\n(绑定核心0-3)]endsubgraph 核心4-7B[RDB/AOF子进程\n(绑定核心4-7)]endendA -->|fork| BA -->|独占核心0-3| C[高效处理请求]B -->|独占核心4-7| D[无干扰持久化]
          
2. 内存交换(Swap)
  • 内存交换是操作系统的内存管理机制,当物理内存不足时,系统会将部分内存中的冷数据(长时间未被访问)移动到磁盘的 Swap 分区,以腾出内存空间给其他进程使用。
    对 Redis 而言,数据原本应完全驻留内存以实现高性能(微秒级响应)。若发生 Swap,访问被换出的数据需经历磁盘 I/O(毫秒级),响应延迟骤增 5~10 万倍

  • 内存交换流程图

    flowchart TDsubgraph 物理内存A[Redis 热点数据\n(高频访问)]B[Redis 冷数据\n(长时间未访问)]C[其他进程占用的内存]endsubgraph 磁盘Swap分区D[被换出的冷数据]endA -->|持续活跃| E[正常响应(微秒级)]B -->|内存不足触发交换| F[Swap Out操作]F -->|数据写入磁盘| DC -->|占用内存增加| FD -->|再次被访问| G[Swap In操作]G -->|数据加载回内存| H[高延迟响应(毫秒级)]
    
    • 流程关键点

      • 触发条件(内存不足)

        • Redis 自身内存超限(如未设置 maxmemory​)
        • 同一服务器运行其他内存密集型进程(如大数据处理、文件 I/O)
      • Swap Out

        操作系统将冷数据从内存迁移到 Swap 分区,释放物理内存空间。

      • Swap In

        Redis 需访问已换出的数据时,触发磁盘读取和数据回迁,导致延迟暴增。

      • 性能影响

        单次 Swap 操作可能引入数毫秒延迟,若高频触发则整体吞吐量断崖式下跌

  • 内存交换的核心原因

    • Redis 内存超限

      • 未配置 maxmemory​:Redis 默认无内存限制,可能无限增长直至触发 Swap。
      • BigKey 或内存碎片:大对象(如 10MB Hash)或碎片化内存占用超出预期
    • 操作系统资源竞争

      • 多进程共存:同一服务器运行 MySQL、Hadoop 等内存密集型服务,挤占 Redis 可用内存。
      • Swap 配置不合理:Linux 默认 vm.swappiness=60​,内存压力大时激进换出数据。
    • 硬件限制

      • 物理内存不足:服务器内存容量无法支撑 Redis 数据集规模
      • 磁盘性能差:机械硬盘的 Swap 操作延迟远高于 SSD(如 10ms vs 0.1ms)。
  • 监控与诊断工具

    • 检查 Swap 使用量

      # 查看 Redis 进程 Swap 情况
      redis-cli info | grep process_id  # 获取 PID
      cat /proc/<PID>/smaps | grep -i swap
      
    • 性能分析工具

      • redis-cli --latency​:检测 Redis 响应延迟波动。
      • vmstat ​:监控系统级 Swap I/O 频率(si/so​ 列)
3. 网络问题
  • 连接数过多:短连接频繁创建或maxclients​设置过低,导致TCP连接处理消耗CPU资源。

  • 带宽不足:高吞吐场景下网络打满,或使用MONITOR​命令记录所有请求。

    • 优化方案

      • 使用连接池管理长连接,设置timeout​自动关闭空闲连接。
      • 禁用MONITOR​,通过Pipeline​批量请求减少网络往返。

三、总结与优化策略

阻塞类型关键表现优先级解决方案
大Key操作单命令执行时间过长拆分Key、改用分片或压缩结构
持久化fork延迟latest_fork_usec​值高降低RDB频率、优化内存页管理
CPU竞争服务器整体CPU饱和隔离部署、绑定CPU核心
内存交换used_memory_rss​异常高紧急禁用Swap、增加物理内存

综合建议

  • 监控工具:使用SLOWLOG​、INFO commandstats​分析慢查询,redis-cli --bigkeys​扫描大Key。
  • 架构设计:采用读写分离、集群分片(Redis Cluster)分散负载。
  • 配置调优:调整maxmemory​、repl-backlog-size​,优化淘汰策略(如volatile-lru​)。

通过上述措施,可显著降低Redis阻塞风险,提升系统稳定性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SLAM学习系列——ORB-SLAM3安装(Ubuntu20-ROS/Noetic)

ORB-SLAM3学习&#xff08;Ubuntu20-ROS&#xff09; 0 主要参考文献1 ORB-SLAM3安装环境配置1.0 前言1.0.0 关于ORB-SLAM3安装版本选择1.0.1 本文配置操作汇总(快速配置)1.0.1.1 ORB_SLAM3环境配置&#xff1a;1.0.1.2 ORB_SLAM3安装1.0.1.3 ORB_SLAM的ROS接口 1.1 C&#xff…

【应用密码学】实验二 分组密码(2)

一、实验要求与目的 1&#xff09; 学习AES密码算法原理 2&#xff09; 学习AES密码算法编程实现 二、实验内容与步骤记录&#xff08;只记录关键步骤与结果&#xff0c;可截图&#xff0c;但注意排版与图片大小&#xff09; 字符串加解密 运行python程序&#xff0c;输入…

区块链基石解码:分布式账本的运行奥秘与技术架构

区块链技术的革命性源于其核心组件——分布式账本&#xff08;Distributed Ledger&#xff09;。这一技术通过去中心化、透明性和不可篡改性&#xff0c;重塑了传统数据存储与交易验证的方式。本文将从分布式账本的核心概念、实现原理、应用场景及挑战等方面展开&#xff0c;揭…

AUTOSAR_RS_ClassicPlatformDebugTraceProfile

AUTOSAR经典平台调试、跟踪与分析支持 AUTOSAR组件调试、跟踪与分析功能详解 目录 简介ARTI核心扩展 核心特定ARTI扩展结构核心参数定义 操作系统和任务扩展 OS特定ARTI扩展任务特定ARTI扩展软件组件特定扩展 总体架构 组件结构接口定义 错误处理 默认错误跟踪器(DET) 总结 1.…

SpringBoot配置RestTemplate并理解单例模式详解

在日常开发中&#xff0c;RestTemplate 是一个非常常用的工具&#xff0c;用来发起HTTP请求。今天我们通过一个小例子&#xff0c;不仅学习如何在SpringBoot中配置RestTemplate&#xff0c;还会深入理解单例模式在Spring中的实际应用。 1. 示例代码 我们首先来看一个基础的配置…

DPIN在AI+DePIN孟买峰会阐述全球GPU生态系统的战略愿景

DPIN基金会在3月29日于印度孟买举行的AIDePIN峰会上展示了其愿景和未来5年的具体发展计划&#xff0c;旨在塑造去中心化算力的未来。本次活动汇集了DPIN、QPIN、社区成员和Web3行业资深顾问&#xff0c;深入探讨DPIN构建全球领先的去中心化GPU算力网络的战略&#xff0c;该网络…

央视两次采访报道爱藏评级,聚焦生肖钞市场升温,评级币成交易安全“定心丸”

CCTV央视财经频道《经济信息联播》《第一时间》两档节目分别对生肖贺岁钞进行了5分钟20秒的专题报道。长期以来&#xff0c;我国一直保持着发行生肖纪念钞和纪念币的传统&#xff0c;生肖纪念钞和纪念币在收藏市场保持着较高的热度。特别是2024年初&#xff0c;央行发行了首张贺…

【计算机哲学故事1-2】输入输出(I/O):你吸收什么,便成为什么

“我最近&#xff0c;是不是废了……”她瘫在沙发上&#xff0c;手机扣在胸口&#xff0c;盯着天花板自言自语。 我坐在一旁&#xff0c;随手翻着桌上的杂志&#xff0c;没接话&#xff0c;等着她把情绪发泄完。 果然&#xff0c;几秒后&#xff0c;她重重地叹了口气&#xf…

封装el-autocomplete,接口调用

组件 <template><el-autocompletev-model"selectedValue":fetch-suggestions"fetchSuggestions":placeholder"placeholder"select"handleSelect"clearablev-bind"$attrs"/> </template><script lang&…

GPUStack昇腾Atlas300I duo部署模型DeepSeek-R1【GPUStack实战篇2】

2025年4月25日GPUStack发布了v0.6版本&#xff0c;为昇腾芯片910B&#xff08;1-4&#xff09;和310P3内置了MinIE推理&#xff0c;新增了310P芯片的支持&#xff0c;很感兴趣&#xff0c;所以我马上来捣鼓玩玩看哈 官方文档&#xff1a;https://docs.gpustack.ai/latest/insta…

Linux进程详细解析

1.操作系统 概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; • 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09; • 其他程序&#xff08…

解决两个技术问题后小有感触-QZ Tray使用经验小总结

老朋友都知道&#xff0c;我现在是一家软件公司销售部门的项目经理和全栈开发工程师&#xff0c;就是这么“奇怪”的岗位&#xff0c;大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。 近期在某个票务系统项目上驻场&#xff0c;原来我是这个项目的项目…

Centos 7.6安装redis-6.2.6

1. 安装依赖 确保系统已经安装了必要的编译工具和库&#xff1a; sudo yum groupinstall "Development Tools" -y sudo yum install gcc make tcl -y 2. 解压 Redis 源码包 进入 /usr/local/ 目录并解压 redis-6.2.6.tar.gz 文件&#xff1a; cd /usr/local/ sudo ta…

Ejs模版引擎介绍,什么是模版引擎,什么是ejs,ejs基本用法

** EJS 模板引擎**&#xff0c;让你彻底搞明白什么是模板引擎、什么是 EJS、怎么用、语法、最佳实践等等&#xff1a; &#x1f4da; 一、什么是模板引擎&#xff1f; 模板引擎是前后端分离之前的一种服务器端“渲染技术”。它的主要作用是&#xff1a; 将 HTML 页面和后端传递…

2025.4.21-2025.4.26学习周报

目录 摘要Abstract1 文献阅读1.1 模型架构1.1.1 动态图邻接矩阵的构建1.1.2 多层次聚合机制模块1.1.3 AHGC-GRU 1.2 实验分析 总结 摘要 在本周阅读的论文中&#xff0c;作者提出了一种名为AHGCNN的自适应层次图卷积神经网络。AHGCNN通过将监测站点视为图结构中的节点&#xf…

6.1 客户服务:智能客服与自动化支持系统的构建

随着企业数字化转型的加速&#xff0c;客户服务作为企业与用户交互的核心环节&#xff0c;正经历从传统人工服务向智能化、自动化服务的深刻变革。基于大语言模型&#xff08;LLM&#xff09;和智能代理&#xff08;Agent&#xff09;的技术为构建智能客服与自动化支持系统提供…

java Optional

我还没用过java8的一些语法&#xff0c;有点老古董了&#xff0c;记录下Optional怎么用。 从源码看&#xff0c;Optional内部持有一个对象&#xff0c; 有一些api对这个对象进行判空处理。 静态方法of &#xff0c;生成Optional对象&#xff0c; 但这个value不能为空&#…

【Java面试笔记:进阶】24.有哪些方法可以在运行时动态生成一个Java类?

在Java中,运行时动态生成类是实现动态编程、框架扩展(如AOP、ORM)和插件化系统的关键技术。 1.动态生成Java类的方法 1.从源码生成 直接生成源码文件:通过Java程序生成源码并保存为文件。编译源码: 使用ProcessBuilder启动javac进程进行编译。使用Java Compiler API(ja…

基于Jamba模型的天气预测实战

深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 由于大气运动极为复杂&#xff0c;影响天气的因素较多&#xff0c;而人们认识大气本身运动的能力极为有限&#xff0c;因此以前天气预报水平较低 。预报员在预…

GAMES202-高质量实时渲染(Real-Time Shadows)

目录 Shadow MappingshadowMapping的问题shadow mapping背后的数学PCF&#xff08;Percentage Closer Filtering&#xff09;PCSS&#xff08;Percentage closer soft shadows&#xff09;VSSM&#xff08;Variance Soft Shadow Mapping&#xff09;优化步骤3优化步骤1SAT&…