【运维篇】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…...
C# 打印PDF的常用方法
这里先提供一个helper类的模板 1.使用默认程序打印 using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing.Printing; using System.IO; using System.Runtime.InteropServices;namespace PDF {public static class PrintHelper{#…...

若依微服务的定制化服务
复制依赖 复制依赖 复制system服务的bootstrap.yml文件,修改port和name 在nacos复制一个新的nacos配置,修改对应的nacos的配置 ,可能不需要修改,看情况。 网关修改 注意curd的事项,模块名称的修改...

Axios 如何通过配置实现通过接口请求下载文件
前言 今天,我写了 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 和 《NodeJS 基于 Koa, 开发一个读取文件,并返回给客户端文件下载》 两篇文章。在这两篇文章中,我实现了数据库的备份,和提供数据库下载等接口。 但是&…...
小表驱动大表更快吗,不是
背景 head头表(5000),line行表(15万),导出数据包含头和行,一对多。 以行表为维度导出15万数据。 sql 如下两个sql查询,有如下差异 驱动方式:第一个大表驱动小表&…...

20250529-C#知识:运算符重载
C#知识:运算符重载 运算符重载能够让我们像值类型数据那样使用运算符对类或结构体进行运算,并且能够自定义运算逻辑。 1、运算符重载及完整代码示例 作用是让自定义的类或者结构体能够使用运算符运算符重载一定是public static的可以把运算符看成一个函…...
【HW系列】—目录扫描、口令爆破、远程RCE流量特征
本文仅用于技术研究,禁止用于非法用途。 文章目录 目录扫描漏洞的流量特征及检测方法一、基础流量特征二、工具特征差异三、绕过行为特征四、关联行为特征五、检测与防御建议 口令爆破漏洞的流量特征及检测方法一、基础流量特征二、工具标识特征三、绕过行为特征四…...

如何在WordPress网站中添加相册/画廊
在 WordPress 网站上添加相册可以让您展示许多照片。无论您是在寻找标准的网格相册画廊还是独特的瀑布流相册画廊体验,学习如何在 WordPress 网站上添加相册总是一个好主意。在本教程中,我们将介绍两种为 WordPress 网站添加相册的方法:使用区…...
【NLP基础知识系列课程-Tokenizer的前世今生第一课】Tokenizer 是什么?为什么重要?
语言的“颗粒度”:我们到底在切什么? 我们都知道模型要处理文本,第一步是把一段段字符变成“token”。但这些 token 究竟应该是句子、单词,还是更小的片段,比如“un break able”? 这背后涉及的是一个非…...

Codeforces Round 1025 (Div. 2)
Problem - A - Codeforces 查有没有人说谎,有一个必错的情况: 两个人都说输了,必有人撒谎,还有就是所有人都赢了,也是撒谎 来看代码: #include <iostream> #include <vector> using namespa…...

Ubuntu20.04操作系统ssh开启oot账户登录
文章目录 1 前提2 设置root密码3 允许ssh登录root账户3.1 编辑配置文件3.2 重启ssh服务 4 安全注意事项 1 前提 ssh可以使用普通用户正常登录。 2 设置root密码 打开终端,设置密码 sudo passwd root # 设置root密码3 允许ssh登录root账户 3.1 编辑配置文件 su…...