Redis 慢查询分析与优化

Redis 慢查询分析与优化

参考书籍 : https://weread.qq.com/web/reader/d5432be0813ab98b6g0133f5kd8232f00235d82c8d161fb2

以下从配置参数耗时细分分析工具优化策略四个维度深入解析 Redis 慢查询问题,结合实战调优建议,帮助开发者精准定位并优化性能瓶颈。


一、慢查询核心配置参数

image

Redis 慢查询功能通过两个关键参数控制,直接影响日志记录范围和存储容量:

  1. slowlog-log-slower-than

    • 功能:设定命令执行时间的阈值(单位:微秒),超过此值的命令会被记录。

    • 默认值:10000 微秒(10 毫秒),建议高并发场景调整为 1000 微秒(1 毫秒)

    • 特殊值

      • 0​:记录所有命令(调试用)。
      • 负值:禁用慢查询日志。
  2. slowlog-max-len

    • 功能:定义慢查询日志列表的最大长度(先进先出队列)。
    • 默认值:128 条,生产环境建议调至 1000 条以上,避免关键日志被覆盖。

配置示例

# 动态设置(临时生效)  
CONFIG SET slowlog-log-slower-than 1000  
CONFIG SET slowlog-max-len 1000  # 持久化到配置文件(需重启)  
slowlog-log-slower-than 1000  
slowlog-max-len 1000  

二、耗时细分与瓶颈定位

Redis 命令执行全流程耗时可拆分为以下阶段:

  1. 网络传输(客户端到服务端):

    • 网络延迟或丢包可能导致客户端感知的耗时增加,但不记录在慢查询日志中
    • 排查工具:ping​、traceroute​ 或监控工具(如 Prometheus)。
  2. 命令排队(Redis 内部队列):

    • 单线程架构下,若并发请求过高,命令需排队等待执行。
    • 排队时间不纳入慢查询统计,但可能导致客户端超时。
  3. 命令执行(核心耗时):

    • 实际执行命令的耗时,由慢查询日志的 duration​ 字段记录(单位:微秒)。
    • 高复杂度命令(如 KEYS​、SORT​)或 BigKey 操作是主要瓶颈。
  4. 结果返回(服务端到客户端):

    • 网络传输时间同样不计入慢查询日志,但可能影响客户端体验。

三、慢查询分析工具
  1. 内置命令

    • **SLOWLOG GET [n]​**:获取最近 n 条慢查询日志,含时间戳、耗时、具体命令。

      image

      127.0.0.1:6379> SLOWLOG GET 2  
      1) 1) (integer) 12345         # 日志ID  2) (integer) 1680000000    # 时间戳  3) (integer) 15000         # 耗时(微秒)  4) 1) "SORT"               # 命令及参数  2) "mylist"  
      
    • **SLOWLOG LEN​**:查看当前慢查询日志数量。

    • **SLOWLOG RESET​**:清空日志列表。

  2. 监控工具

    • **INFO COMMANDSTATS​**:统计所有命令的执行次数和总耗时,定位高频耗时命令。

      image

      参数介绍:

      截图中每一项均以 cmdstat_<命令名>​ 开头,代表对应 Redis 命令的执行统计信息,各参数含义如下:

      参数名含义
      calls该命令的总执行次数。
      usec该命令所有执行耗时的总和(单位:微秒,μs)。
      usec_per_call该命令的平均执行时间(单位:微秒,μs),即 usec ÷ calls​。
      rejected_calls该命令被拒绝执行的次数(如权限不足、命令被禁用等情况)。
      failed_calls该命令执行过程中失败的次数(如参数错误、执行逻辑异常等)。

      cmdstat_ttl:calls=304,usec=3064,usec_per_call=10.08,rejected_calls=1,failed_calls=0​ 为例:

      • TTL​ 命令共执行 304​ 次,总耗时 3064​ 微秒,平均每次耗时 10.08​ 微秒,被拒绝执行 1​ 次,执行失败 0​ 次。

      其他项(如 cmdstat_auth​、cmdstat_set​ 等)均遵循此格式,分别对应各自命令的统计数据,可据此分析命令的执行频率、性能及异常情况。

    • **MONITOR​**:实时捕获所有命令(慎用,可能引发性能问题)。

    • 第三方工具:Prometheus + Grafana 实现可视化监控。 后续研究


四、优化策略与实战建议
  1. 规避高复杂度命令

    • 替代方案

      • SCAN​ 代替 KEYS​ 遍历键。
      • 客户端实现排序,避免 SORT​ 命令处理大数据集。
    • 分页处理:对大型集合使用 LRANGE​ 分批次获取数据。

  2. BigKey 治理

    • 拆分存储:将大 Hash/List 拆分为多个子键(如 user:1001:logs_part1​)。

    • 渐进式删除:通过 Lua 脚本分批次删除 BigKey,避免阻塞。

      -- 分批次删除大列表  
      local key = KEYS[1]  
      for i = 1, 1000 do  redis.call("LPOP", key)  
      end  
      
  3. 配置调优

    • 内存管理:设置 maxmemory​ 和淘汰策略(如 allkeys-lru​)。
    • 集群分片:使用 Redis Cluster 分散负载,缓解单节点压力。

五、调优最佳实践
  1. 定期日志分析

    • 每日检查慢查询日志,识别高频耗时命令。
    • 结合 INFO COMMANDSTATS​ 验证优化效果。
  2. 阈值动态调整

    • 业务高峰期临时降低 slowlog-log-slower-than​(如 500 微秒),捕捉潜在问题。
  3. 日志持久化

    • 定期将慢查询日志导出到外部存储(如 Elasticsearch),便于长期分析。

总结

通过合理配置 slowlog-log-slower-than​ 和 slowlog-max-len​,结合 SLOWLOG GET​ 和监控工具,可精准定位 Redis 性能瓶颈。优化核心在于规避高复杂度命令、治理 BigKey、动态调整配置及利用集群技术。定期分析日志与监控数据,是保障 Redis 高性能运行的关键。

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

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

相关文章

AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能为 RapidOCR)和 plumberpdf 的对比分析及使用建议

目录标题 Tesseract、PaddleOCR、RapidPaddle&#xff08;可能为 RapidOCR&#xff09;和 plumberpdf 的对比分析1. Tesseract类型: 开源 OCR 引擎特点:缺点:适用场景: 2. PaddleOCR (推荐)类型:特点:缺点:适用场景: 复杂版式文档、多语言混合文本、需要高精度识别的场景&#…

算法 | 成长优化算法(Growth Optimizer,GO)原理,公式,应用,算法改进研究综述,matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 成长优化算法 一、算法原理二、核心公式三、应用领域四、算法改进研究五…

网络原理(TCP协议—协议格式,性质(上),状态)

目录 1.TCP协议段格式。 2.TCP协议传输时候的性质。 2.1确认应答。 2.2超时重传。 2.3连接管理。 2.3.1 三次握手。 2.3.2四次挥手。 3.TCP常见的状态。 1.TCP协议段格式。 TCP协议段是由首部和数据两部分构成的。首部包含了TCP通信所需要的各种控制信息&#xff0c;而…

XAML 标记扩展

# XAML 标记扩展详解 标记扩展(Markup Extensions)是XAML中一种特殊的语法结构&#xff0c;允许在XAML属性中嵌入动态值或引用&#xff0c;而不是简单的静态值。它们使用花括号{}作为标识&#xff0c;是XAML强大功能的核心组成部分。 ## 基本语法结构 所有标记扩展都遵循以下…

DeepSeek+Cursor+Devbox+Sealos项目实战

黑马程序员DeepSeekCursorDevboxSealos带你零代码搞定实战项目开发部署视频教程&#xff0c;基于AI完成项目的设计、开发、测试、联调、部署全流程 原视频地址视频选的项目非常基础&#xff0c;基本就是过了个web开发流程&#xff0c;但我在实际跟着操作时&#xff0c;ai依然会…

Ethan独立开发产品日报 | 2025-04-20

1. Checklist GG 基于人工智能的清单管理工具 checklist.gg是一个基于人工智能的清单管理工具&#xff0c;旨在帮助组织确保每次都能正确完成任务。 关键词&#xff1a;AI驱动, 检查清单, 管理工具, 任务管理, 效率提升, 组织管理, 工作流程, 自动化工具, 清单管理, 协作工具…

第十四届蓝桥杯 2023 C/C++组 冶炼金属

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 蓝桥云课 冶炼金属 洛谷 P92…

【数字图像处理】彩色图像处理(1)

研究彩色图像处理的原因 1&#xff1a;利用颜色信息&#xff0c;可以简化目标物的区分&#xff0c;以及从场景中提取出目标物 2&#xff1a;人眼对颜色非常敏感&#xff0c;可以分辨出来几千种颜色色调和亮度&#xff0c;却只能分别出几十种灰度 彩色图像分类 伪彩色图像处理&…

pytest自动化中关于使用fixture是否影响用例的独立性

第一个问题&#xff1a;难道使用fixture 会影响用例独立吗&#xff1f; ✅ 简单回答&#xff1a; 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的&#xff0c;那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&a…

C++计算 n! 中末尾零的数量

* 详细说明* 给定一个整数作为输入。目标是找出该数的阶乘结果中末尾零的数量。 一个数 N 的阶乘是范围 [1, N] 内所有数的乘积。* * 我们知道&#xff0c;只有当一个数是 10 的倍数或者有因数对 (2, 5) 时&#xff0c;才会产生末尾零。 在任何大于 5 的数的阶乘中&#xff0c;…

推荐系统/业务,相关知识/概念2

一、漫画库更新大量新作品&#xff0c;如何融入推荐系统&#xff1f; 参考答案&#xff1a; 快速提取新作品特征&#xff1a;除基础属性外&#xff0c;利用自然语言处理技术提取漫画简介关键词等丰富特征向量&#xff0c;分析情节、角色设定等深层次特征结合物品画像体系分类…

# 手写数字识别:使用PyTorch构建MNIST分类器

手写数字识别&#xff1a;使用PyTorch构建MNIST分类器 在这篇文章中&#xff0c;我将引导你通过使用PyTorch框架构建一个简单的神经网络模型&#xff0c;用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集&#xff0c;包含了60,000张训练图像和10,000张…

强化学习笔记(三)——表格型方法(蒙特卡洛、时序差分)

强化学习笔记&#xff08;三&#xff09;——表格型方法&#xff08;蒙特卡洛、时序差分&#xff09; 一、马尔可夫决策过程二、Q表格三、免模型预测1. 蒙特卡洛策略评估1) 动态规划方法和蒙特卡洛方法的差异 2. 时序差分2.1 时序差分误差2.2 时序差分方法的推广 3. 自举与采样…

c++_csp-j算法 (4)

迪克斯特拉() 介绍 迪克斯特拉算法(Dijkstra算法)是一种用于解决单源最短路径问题的经典算法,由荷兰计算机科学家艾兹赫尔迪克斯特拉(Edsger W. Dijkstra)于1956年提出。迪克斯特拉算法的基本思想是通过逐步扩展已经找到的最短路径集合,逐步更新节点到源节点的最短路…

(13)VTK C++开发示例 --- 透视变换

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 在VTK&#xff08;Visualization Toolkit&#xff09;中&#xff0c;vtkPerspectiveTransform 和 vtkTransform 都是…

深入探索Qt异步编程--从信号槽到Future

概述 在现代软件开发中,应用程序的响应速度和用户体验是至关重要的。尤其是在图形用户界面(GUI)应用中,长时间运行的任务如果直接在主线程执行会导致界面冻结,严重影响用户体验。 Qt提供了一系列工具和技术来帮助开发者实现异步编程,从而避免这些问题。本文将深入探讨Qt…

基于Python的图片/签名转CAD小工具开发方案

基于Python的图片/签名转CAD工具开发方案 一、项目背景 传统设计流程中&#xff0c;设计师常常需要将手写签名或扫描图纸转换为CAD格式。本文介绍如何利用Python快速开发图像矢量化工具&#xff0c;实现&#xff1a; &#x1f4f7; 图像自动预处理✏️ 轮廓精确提取⚙️ 参数…

【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(17):PlanReactExecutor

CangjieMagic框架&#xff1a;使用华为仓颉编程语言编写&#xff0c;专门用于开发AI Agent&#xff0c;支持鸿蒙、Windows、macOS、Linux等系统。 这篇文章剖析一下 CangjieMagic 框架中的 PlanReactExecutor。 1 PlanReactExecutor的工作原理 #mermaid-svg-OqJUCSoxZkzylbDY…

一文了解相位阵列天线中的真时延

本文要点 真时延是宽带带相位阵列天线的关键元素之一。 真时延透过在整个信号频谱上应用可变相移来消除波束斜视现象。 在相位阵列中使用时延单元或电路板&#xff0c;以提供波束控制和相移。 市场越来越需要更快、更可靠的通讯网络&#xff0c;而宽带通信系统正在努力满…

Java中 关于编译(Compilation)、类加载(Class Loading) 和 运行(Execution)的详细区别解析

以下是Java中 编译&#xff08;Compilation&#xff09;、类加载&#xff08;Class Loading&#xff09; 和 运行&#xff08;Execution&#xff09; 的详细区别解析&#xff1a; 1. 编译&#xff08;Compilation&#xff09; 定义 将Java源代码&#xff08;.java文件&#x…