【运维篇】5.4 Redis 并发延迟检测
文章目录
- 0.前言
- Redis工作原理
- 可能引起并发延迟的常见操作和命令
- 并发延迟检测
- 分析和解读监控数据:
- 优化并发延迟的策略
- 1. 检查CPU情况
- 2. 检查网络情况
- 3. 检查系统情况
- 4. 检查连接数
- 5. 检查持久化 :
- 6. 检查命令执行情况
0.前言
Redis 6.0版本之前其使用单线程模型处理所有命令。这意味着在给定的时间内,只有一个命令正在执行。虽然Redis非常快,每秒可以处理上万到十万个命令,但如果有一个命令需要大量的时间来执行,那么其他的命令就必须等待,这就是所谓的"并发延迟"。
并发延迟可能会导致应用程序的整体性能下降,因此对Redis的并发延迟进行检测和优化十分重要。尤其是在并发高、数据量大的生产环境中,及时地发现并解决潜在的并发延迟问题,对于保证Redis的性能和稳定性至关重要。
本篇博文将介绍Redis并发延迟的原因,以及如何检测并优化Redis的并发延迟。我们首先会解释Redis的工作原理,然后讨论一些可能引起并发延迟的常见操作和命令。接着,我们将讨论如何使用Redis自带的延迟监控功能进行并发延迟检测,以及如何分析和解读这些监控数据。最后,我们将提供一些实际的策略和建议,来帮助你优化Redis的并发延迟,提高Redis的性能和稳定性。
Redis工作原理
Redis 每个请求被接收后,Redis会将它放入一个队列中,然后顺序执行每个命令。这种模型的好处是避免了多线程并发访问数据时可能发生的冲突和锁的问题,但同时也意味着如果有一个命令执行时间过长,它会阻塞后面的所有命令。
可能引起并发延迟的常见操作和命令
- 大键操作:对于包含大量元素的列表、集合、有序集合或哈希等数据结构的操作可能会导致延迟。
- 慢查询:一些复杂的查询或计算密集型命令(如SORT、SUNION等)可能花费更长时间执行。
- 阻塞命令:某些命令(如BLPOP)在等待条件满足时会阻塞其他命令的执行。
- 持久化:如果使用RDB或AOF方式持久化数据,持久化操作可能会影响命令的执行。
并发延迟检测
Redis提供了一些内置的工具和命令来监控并发延迟:
SLOWLOG命令:记录执行时间超过指定阈值的命令。INFO命令:查看和分析Redis服务器的统计信息和性能指标。LATENCY MONITOR特性:监控和报告Redis操作的延迟。
分析和解读监控数据:
SLOWLOG GET:分析慢查询日志,找出执行时间过长的命令。INFO命令的输出:查看特定的性能指标,例如每秒命令数、命中率、内存使用情况等。LATENCY MONITOR:识别导致延迟的具体操作和时间点。
优化并发延迟的策略
- 优化数据结构:避免使用大键,合理设计数据结构。
- 限制慢查询:设置合理的超时阈值,对慢查询进行限制。
- 分片:将数据分布到多个Redis实例上,减轻单个实例的负担。
- 使用更快的持久化策略:如使用无磁盘同步等技术减少持久化操作对性能的影响。
- 硬件优化:升级硬件资源,如使用更快的CPU或增加内存。
- 避免阻塞命令:尽量避免使用会造成阻塞的命令,或将它们移到辅助线程中执行。
- 监控和调优:定期监控Redis的性能指标,根据监控数据调优配置。
1. 检查CPU情况
使用top命令查看CPU使用情况。
top - 10:00:01 up 1 day, 2:43, 2 users, load average: 1.05, 0.70, 0.58Tasks: 193 total, 2 running, 191 sleeping, 0 stopped, 0 zombie%Cpu(s): 25.1 us, 1.4 sy, 0.0 ni, 73.0 id, 0.4 wa, 0.0 hi, 0.1 si, 0.0 stKiB Mem : 16337836 total, 812508 free, 8736168 used, 6715160 buff/cacheKiB Swap: 2097148 total, 2097148 free, 0 used. 7106764 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND12345 redis 20 0 1.916g 1.800g 1020 S 99.9 11.4 22:10.82 redis-server
这里可以看到,redis-server进程的CPU使用率接近100%,这表明可能需要垂直扩展。
也可以使用mpstat
mpstat是一个展示CPU使用情况的工具,它可以显示所有CPU的统计信息,以及单个CPU的统计信息。命令mpstat -P ALL 1的含义是显示所有CPU核心的性能统计数据,每隔1秒更新一次。以下是该命令的模拟输出:
Linux 4.15.0-123-generic (ubuntu) 12/02/2021 _x86_64_ (8 CPU)10:01:01 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:01:02 AM all 3.50 0.00 1.25 0.75 0.00 0.12 0.00 0.00 0.00 94.38
10:01:02 AM 0 7.00 0.00 1.00 2.00 0.00 0.00 0.00 0.00 0.00 90.00
10:01:02 AM 1 2.00 0.00 1.50 0.00 0.00 0.50 0.00 0.00 0.00 96.00
10:01:02 AM 2 3.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 95.00
10:01:02 AM 3 4.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 94.00
10:01:02 AM 4 3.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 95.00
10:01:02 AM 5 3.00 0.00 1.00 0.50 0.00 0.50 0.00 0.00 0.00 95.00
10:01:02 AM 6 4.00 0.00 2.00 0.50 0.00 0.50 0.00 0.00 0.00 93.00
10:01:02 AM 7 3.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 96.00
每一行表示一个CPU的统计数据,包括用户空间(%usr)、优先级更低的进程(%nice)、系统空间(%sys)等等。最后一列是空闲时间(%idle)。
2. 检查网络情况
使用netstat命令检查Redis端口的网络情况。
netstat -nlt | grep 6379tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp6 0 0 ::1:6379 :::* LISTEN
这里显示了本机6379端口正在监听网络连接。
3. 检查系统情况
使用vmstat命令检查系统资源情况。
vmstat 1 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 812508 12345 6715160 0 0 12 45 342 1234 25 1 73 0 0...
Redis 本身并不提供直接的命令来检查网络情况,但可以通过几种方式来评估Redis服务的网络性能或连接状态。
PING命令:这是Redis的一个基础命令,用于检查服务是否运行并能响应命令。
PING
如果服务运行正常,将得到一个PONG响应。
INFO命令:这个命令提供了Redis服务器和其客户端的详细信息,包括网络相关的统计数据。比如:
INFO replicationINFO stats
这些子命令会显示连接和同步的信息,以及执行的命令数量等。
CLIENT LIST命令:这个命令会展示所有连接到Redis服务器的客户端列表及其相关的信息,包括地址、端口、连接时长、空闲时间等。
CLIENT LIST
- 网络工具:除了Redis命令,还可以使用标准的网络工具来检测与Redis服务的连接情况。比如
ping命令检查网络延迟,telnet或nc(netcat)尝试连接到Redis服务端口,traceroute或tracert(在Windows上)来追踪数据包路径。
ping <redis-server-ip>telnet <redis-server-ip> <redis-port>nc -vz <redis-server-ip> <redis-port>traceroute <redis-server-ip>
MONITOR命令:尽管这并非直接检查网络情况的命令,但它允许监视实时的Redis服务器接收到的命令,可以帮助理解Redis服务器的负载情况。
MONITOR
如果发现Redis的响应时间长或连接数异常,可能是网络延迟、带宽限制、过载或其他网络问题。在这种情况下,检查的网络配置、防火墙规则和硬件设备可能会很有帮助。
在Redis中,你可以使用以下命令检查系统的状态和性能:
INFO命令:这个命令提供了关于Redis服务器的各种信息和统计,包括内存使用、CPU使用、客户端连接、数据库统计等。
INFO
这会返回一系列的信息。对于系统和网络的检查,你可能会对这部分感兴趣:
used_memory: 用于表示Redis分配的内存总量,以字节(bytes)为单位。used_memory_human: 以更易读的格式展示Redis分配的内存总量(如KB、MB、GB)。connected_clients: 已连接客户端的数量。instantaneous_ops_per_sec: Redis当前的qps,即每秒的查询次数。
SLOWLOG命令:这个命令可以帮你找到那些执行时间较长的命令。你可以使用SLOWLOG GET来获取慢查询日志的内容,使用SLOWLOG LEN来获取慢查询日志的长度,使用SLOWLOG RESET来清空慢查询日志。
SLOWLOG GETSLOWLOG LENSLOWLOG RESET
4. 检查连接数
使用redis-cli info命令查看Redis的连接数。模拟输出可能如下:
redis-cli info | grep connected_clientsconnected_clients:10
显示当前有10个客户端连接到Redis服务器。

5. 检查持久化 :
使用redis-cli info命令检查Redis持久化情况。
redis-cli info | grep rdb_last_bgsave_statusrdb_last_bgsave_status:ok
显示最后一次背景保存(bgsave)的状态是成功的。
在Redis中,最常用的持久化方式有RDB和AOF,可以通过INFO persistence命令查看相关的持久化信息。
对于RDB持久化,latest_fork_usec字段显示上一次执行fork操作的持续时间,单位为微秒。这通常在Redis每次执行RDB或AOF重写时发生。
以下是INFO persistence命令的一些输出示例:
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1626293675
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:2498560
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
其中,关于RDB的一些关键字段解释如下:
rdb_changes_since_last_save: 自上次成功生成RDB文件后,Redis服务器接收到的写命令数量。rdb_bgsave_in_progress: 如果服务器正在创建RDB文件,那么值为1,否则为0。rdb_last_save_time: 服务器最后一次成功执行SAVE或BGSAVE命令的Unix时间戳。rdb_last_bgsave_status: 最后一次BGSAVE命令的执行状态,成功为ok,失败为err。rdb_last_bgsave_time_sec: 最后一次成功执行BGSAVE命令耗费的时长,以秒为单位。
同样,你也可以通过CONFIG GET save命令查看RDB的触发条件,该命令返回的结果形式如下:
1) "save"
2) "900 1 300 10 60 10000"
上述结果表示,当以下任一条件满足时,Redis会自动触发BGSAVE命令:
- 900秒内有1个key发生变更
- 300秒内有10个key发生变更
- 60秒内有10000个key发生变更
6. 检查命令执行情况
使用redis-cli monitor命令查看Redis命令执行的实时情况。
redis-cli monitor1614092587.248133 [0 127.0.0.1:6379] "set" "key1" "value1"1614092587.251993 [0 127.0.0.1:6379] "get" "key1"
检查Redis中每个命令的执行情况可以通过INFO commandstats命令,这个命令提供了关于Redis服务器上每个命令执行的统计数据。
INFO commandstats
执行上述命令,Redis将返回各种命令及其相关统计信息。返回的结果形式如下:
cmdstat_get:calls=100,usec=700,usec_per_call=7.00
cmdstat_set:calls=50,usec=300,usec_per_call=6.00
cmdstat_del:calls=20,usec=200,usec_per_call=10.00
在上面的输出中,每一行表示一个命令的统计信息:
cmdstat_get,cmdstat_set,cmdstat_del分别代表get,set,del这三个命令的统计数据。calls字段表示该命令被调用的次数。usec字段表示该命令总的执行时间,以微秒为单位。usec_per_call字段表示该命令每次执行的平均时间,以微秒为单位。
相关文章:
【运维篇】5.4 Redis 并发延迟检测
文章目录 0.前言Redis工作原理可能引起并发延迟的常见操作和命令并发延迟检测分析和解读监控数据:优化并发延迟的策略 1. 检查CPU情况2. 检查网络情况3. 检查系统情况4. 检查连接数5. 检查持久化 :6. 检查命令执行情况 0.前言 Redis 6.0版本之前其使用单…...
碰到一个逆天表中表数据渲染
1. 逆天表中表数据问题 我有一个antd-table组件,他的编辑可以打开一个编辑弹窗打开弹窗里面还会有一个表格,如果这个表格的column是在外层js文件中保存的话,那么第一次打开会正常渲染数据,再次打开就不会渲染,即使是已…...
记录我常用的免费API接口
目录 1.随机中英文句子 2.随机中英文句子(带图片和音频) 3.随机一句诗 4.随机一句话 5.随机一句情话 6. 随机一句舔狗语录 7.历史上的今天 8.获取来访者ip地址 9:获取手机号信息 10. 垃圾分类查询 11.字典查询 12.QQ信息查询 1.随…...
编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载
编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件&…...
创芯科技USB_CAN【库文件】
只用到【只收】【只发】功能 23.11.18 using help; //using Models; using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Sys…...
React整理总结(四)
1.过渡动画react-transition-group Transition 与平台无关,不一定使用css实现CSSTransition组件,in属性控制展示隐藏,添加className;有三个状态appear | enter | exit 第一类,开始状态:对于的类是-appear、…...
ajax,axios,fetch
文章目录 ajax工作原理ajax发请求四个步骤创建xmlhttprequest对象设置请求方式设置回调函数发送请求 自封装ajax axiosaxios 特性如何用配置拦截器fetch 三者区别 ajax 工作原理 Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务…...
Java值传递和引用传递
在Java中,有值传递(Pass-by-Value)和引用传递(Pass-by-Reference)两种参数传递方式。 值传递(Pass-by-Value):当使用值传递方式时,方法将参数的副本传递给调用方法。这意…...
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1)
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) 单字节写时序单字节读时序I2C 控制器设计模块框图scl_high 和 scl_low 产生的时序图状态转移图 Verilog代码 FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) FPG…...
LabVIEW编程开发NI-USRP
LabVIEW编程开发NI-USRP 可编程性是SDR的关键特性,它使人们能够将无线电外围设备转换为先进的无线系统。USRP是市场上最开放、最通用的SDR,可帮助工程师在主机和FPGA上使用各种软件开发工具构建系统。 有多种选项可用于对基于SDR的系统的主机进行编程。…...
ES6中实现继承
本篇文章主要说明在ES6中如何实现继承,学过java的小伙伴,对class这个关键字应该不陌生,ES6中也提供了class这个关键字作为实现类的语法糖,咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类ÿ…...
车载通信架构 —— 新车载总线类型下(以太网)的通信架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...
ArkTS - HarmonyOS服务卡片(创建)
可以参考官网文档 其中我们在已有的文件中File > New > Service Widget创建你想要的小卡片 本文章发布时目前可使用的模板就三种 有卡片后的new 最终效果...
Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献
Zotero以其丰富的插件而闻名,使用起来十分的带劲,最重要的是它是免费的、不卡顿,不像某专业软件。 然而Zotero在word插入参考文献时,无法为参考文献添加超链接,这是一个不得不提的遗憾。 不过,有大佬已经…...
持续集成部署-k8s-配置与存储-配置管理:ConfigMap 的热更新
ConfigMap 的热更新 1. 简介2. 新建 Pod3. 使用 edit 命令编辑修改4. 使用 replace 命令替换修改1. 简介 在 Kubernetes 中,ConfigMap 是用于存储非敏感配置数据的 API 对象,它可以被挂载到 Pod 中作为文件或环境变量。ConfigMap 的热更新指的是在不重启 Pod 的情况下,动态…...
Python文本段落翻译
Python文本段落翻译 1、Translate库2、基本使用 1、Translate库 translate非标准库是Python中可以实现对多种语言进行互相翻译的库,translate可以将原始文本或段落翻译成我们需要的目标语言 translate支持多种语言,常见的例如: zh/zh-CN&…...
Flink(七)【输出算子(Sink)】
前言 今天是我写博客的第 200 篇,恍惚间两年过去了,现在已经是大三的学长了。仍然记得两年前第一次写博客的时候,当时学的应该是 Java 语言,菜的一批,写了就删,怕被人看到丢脸。当时就想着自己一年之后&…...
【自我管理】To-do list已过时?学写Done List培养事业成功感
自我管理:已完成清单(doneList)培养事业成功感 待办事项清单常常让人感到压力山大,让人不想面对工作。但是,你知道吗?除了待办清单之外,还有一个叫做「已完成清单」的东西,它可能更符…...
优思学院|什么是精益生产管理?从一个生活上的故事出发来说明。
你关掉电脑,离开办公室。 一个小时后,你进入家门和孩子们在一起。 你和家人一起吃晚饭。 你的老板打电话来查看你的项目进展。 你哄孩子入睡并给他们读个故事。 作为一个负责任的父母,你想要与孩子们的互动时间增加并提高生活的质量&…...
Swagger-----knife4j框架
简介 使得前后端分离开发更加方便,有利于团队协作 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担 功能测试 Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Spri…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
