Redis变慢?深入浅出Redis性能诊断系列文章(一)

(本文首发于”数据库架构师”公号,订阅”数据库架构师”公号,一起学习数据库技术)

Redis 作为一款业内使用率最高的内存数据库,其拥有非常高的性能,单节点的QPS压测能达到18万以上。但也正因此如此,当应用访问 Redis 时,如果发现响应延迟变大时就会给业务带来非常大的影响。

比如在日常使用Redis时,肯定或多或少都遇到过下面这种问题:

  • 为什么Redis服务过去一直很稳定,突然从今天某个时间点开始变慢了?
  • 为什么访问Redis相同的命令,有时响应很快,有时却非常慢?
  • 为什么访问Redis突然卡住了,过一会又自动恢复了,这也导致业务请求出现很多的毛刺?
  • 。。。

如果不理解 Redis 的架构体系、核心功能的实现原理甚至一些命令的使用限制等,那么这种访问变慢问题的排查就会一头雾水,不知道从哪里下手才好。

本文基于多年使用和运维管理Redis的经验,详细梳理了可能引起Redis性能问题的原因并剖析对应的解决方案,也希望这一系列的文章能帮助大家更加合理的使用 Redis ,快速的定位并解决问题。

一、Redis访问架构链路分析

首先,在深入分析Redis服务前,需要弄清楚是不是真的Redis访问变慢了。

如果我们发现自己的应用服务响应延迟变长,我们首先要排查应用内部,确认是不是访问Redis路径变慢进而拖慢了整个服务的响应吞吐。

这里有两个比较关键的自查:

  • 对于应用服务访问Redis的请求,记录下每次请求的响应延时(比如使用分布式链路跟踪系统等),看看是不是访问Redis响应时间变长了;
  • 排查应用服务的多个节点,看看是不是每个节点都有问题,还是仅仅一个出现了问题。

这两个是后续深入分析Redis服务问题前的关键自查,事半功倍!

对于第一点从应用到Redis这条链路变慢的原因可能有如下两个:

  • 应用到Redis服务之间的链路出现问题了,比如Redis所在服务器网络负载过高丢包、交换机问题、Proxy变慢等;
  • Redis本身确实因为一些原因变慢了。

一般服务器层面都会有相关监控,网络的问题很容易就会发现,比如网卡打满、网卡降频【万兆降为千兆】等。

对于Redis访问链路的响应时间则可以做个模拟监控,如下Redis访问架构,应用程序经过域名系统、VIP系统,最后才到Redis所在的服务器,这种情况下则分别可以模拟 请求域名、请求VIP、请求直连Redis Server三条路径来评估响应时间是否确实变长了。

下面是另外一种Redis架构,访问路径又有不同,那么排查的方向也不会不同。

二、Redis性能基准测评

如果核查发现确实是请求Redis的服务响应耗时变长了,那么此刻就可以把问题分析的焦点放到Redis上了。

下面我们重点分析下Redis性能问题。

首先,需要对 Redis 进行基准的性能测试,了解我们的 Redis 服务在当前环境服务器上的基准性能。

什么是基准性能?

简单来讲,基准性能就是指在一台负载正常的服务器上,访问Redis的最大的响应延迟和平均响应延迟分别是怎样的?

为什么要测试基准性能?参考官方提供的响应延迟测试,来判断自己的 Redis服务是否变慢不行吗?

答案是不行的。

因为Redis 在不同的软硬件环境下,它的性能表现差别特别大,不同主频型号的CPU、不同的SSD硬盘,都会极大影响Redis的性能表现。服务器配置比较低时延迟为 10ms 时,才认为 Redis响应变慢了,但是如果配置比较高,那么可能延迟是 1ms 时就可以认为 Redis 变慢了。

所以,只有了解我们的 Redis 在生产环境服务器上的基准性能,才能进一步评估,当其延迟达到什么程度时,才认为 Redis 确实变慢了。

Redis自带的工具可以帮助我们完成这种测评,如下介绍两种基准性能测试的方式。

方式一:redis-cli –intrinsic-latency

为了避免业务测试服务器到 Redis 服务器之间的网络延迟,需要直接在 Redis 服务器上测试实例的响应延迟情况。执行以下命令,就可以测试出这个实例 120 秒内的最大响应延迟:

shell> redis-cli -h 127.0.0.1 -p 6379 –intrinsic-latency 120

Max latency so far: 4 microseconds.

Max latency so far: 5 microseconds.

Max latency so far: 15 microseconds.

Max latency so far: 23 microseconds.

Max latency so far: 64 microseconds.

Max latency so far: 196 microseconds.

Max latency so far: 245 microseconds.

Max latency so far: 246 microseconds.

Max latency so far: 254 microseconds.

Max latency so far: 259 microseconds.

29298480 total runs (avg latency: 4.0958 microseconds / 40957.76 nanoseconds per run).

Worst run took 63x longer than the average latency.

从输出结果可以看到,这 120 秒内的最大响应延迟为 259 微秒(0.259毫秒)。

方式二:redis-benchmark

Redis-benchmark是Redis官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能.

shell> redis-benchmark -h 127.0.0.1 -p 6379 -t set,get -c 500 -n 100000

====== SET ======

100000 requests completed in 1.02 seconds

500 parallel clients

3 bytes payload

keep alive: 1

0.00%

Original: https://www.cnblogs.com/databasepub/p/16691135.html
Author: 数据库架构师
Title: Redis变慢?深入浅出Redis性能诊断系列文章(一)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621402/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Django基础学习之Cookie 和 Sessions 应用

    在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX…

    Java 2023年5月29日
    047
  • 升级java11后,maven命令打包报错

    一、问题 升级java11后,maven命令打包报错: mvn clean package -Dmaven.test.skip=true [ERROR] Failed to exe…

    Java 2023年5月29日
    064
  • 用jquery实现省市联动

    省市联动 var pros = [‘请选择省份’,’广东省’,’湖南省’,’四川省’]; var cities = [ [], [‘广州’,’汕头’,’珠海’,’茂名’,’东莞’,…

    Java 2023年6月6日
    089
  • 自己动手实现java数据结构(九) 跳表

    跳表介绍 在之前关于数据结构的博客中已经介绍过两种最基础的数据结构:基于连续内存空间的向量(线性表)和基于链式节点结构的链表。 有序的向量可以通过二分查找以logn对数复杂度完成随…

    Java 2023年6月8日
    079
  • 设计模式笔记(一):单例模式

    单例模式可以说是设计模式中最简单的设计模式之一了。顾名思义,单例模式指的是一个类只提供一个固定的单个实例,大家共用该实例。 单例模式代码实现步骤: 1、私有化类的构造方法 2、提供…

    Java 2023年6月6日
    056
  • Java 判断字符串 中文是否为乱码

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChineseUtill …

    Java 2023年5月29日
    063
  • Java内部类

    Java中可以将一个类定义在另一个类中或一个方法中,这样的类称为 内部类 内部类一般来说分为下面几种: 成员内部类(可以分为静态成员内部类、非静态成员内部类) 局部内部类 匿名内部…

    Java 2023年6月13日
    064
  • 【SSM框架】SpringMVC笔记 — 汇总

    1、什么是 SpringMVC? SpringMVC 是基于 MVC 开发模式的框架,用来优化控制器。它是 Spring 家族的一员,它也具备 IOC 和 AOP。 什么是MVC?…

    Java 2023年6月8日
    075
  • Spring Authorization Server 0.2.3发布,放出联合身份DEMO

    很快啊 Spring Authorization Server又发新版本了,现在的版本是 0.2.3。本次都有什么改动呢?我们来了解一下。 0.2.3版本特性 本次更新的新特性不少…

    Java 2023年5月30日
    082
  • Java高并发教程:详解NIO Selector类

    Java高并发教程:详解NIO Selector类 NIO Selector Java NIO Selector可以检查一个或多个Java NIO Channel实例,并确定哪些通…

    Java 2023年5月29日
    070
  • SVN问题之——org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir

    https://blog.csdn.net/a_running_wolf/article/details/50833462 Original: https://www.cnblog…

    Java 2023年5月29日
    076
  • IO流整的明明白白!

    ​ File课理解为文件和文件夹(目录),用于表示磁盘中某个文件或文件夹的路径。该类包含了文件的创建、删除、重命名、判断是否存在等方法。 ​ 只能设置和获取文件本身的信息(文件大小…

    Java 2023年6月7日
    0110
  • 二叉搜索树,一个简单但是非常常见的数据结构

    前言 今天leetcode的每日一题450是关于删除二叉搜索树节点的,题目要求删除指定值的节点,并且需要保证二叉搜索树性质不变,做完之后,我觉得这道题将二叉搜索树特性凸显的很好,首…

    Java 2023年6月9日
    075
  • 力扣算法题9. 回文数(Java)

    力扣算法题9. 回文数(Java) 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一…

    Java 2023年6月7日
    067
  • 教学日志:javaSE-初识java

    一、编译执行第一个java程序 /* 总结: 1、编译执行第一个java程序 步骤如下: 1、安装JDK开发环境; 2、配置环境变量,JAVA_HOME,PATH;–验证环境变量…

    Java 2023年6月5日
    063
  • 一个校验接口引发的思考–我真的了解Response吗

    一个校验接口 最近,我需要对接一个外部接口,基本功能是:校验指定的门店是否完善了货运信息。接口大致是这样的: POST https://******/Dealer/CheckCar…

    Java 2023年6月14日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球