前提介绍

本篇文章首要介绍了Redis的履行的慢查询的功用的查询和装备功用,从而能够方便咱们在实际工作中,进行剖析Redis的功用运行状况以及对应的优化Redis功用的佐证和目标因素。

在咱们5.0左右的版别中Redis运用单线程架构和I/O多路复用模型来完成高功用的内存数据服务。接下来首要剖析Redis单线程指令处理机制,接着剖析Redis单线程模型为什么功用如此之高。

单线程指令的处理机制

Redis客户端与服务端的模型首要是下图所示。

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

每次客户端调用都阅历了发送指令、履行指令、回来结果三个过程。

本章内容

本章的文章内容首要是一下几点。

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

什么是慢查询

慢查询便是当Redis在处理一条指令的时分,当超过了系统装备的履行时刻的阈值的时分,就会被系统当作慢查询计算和断定。

慢查询日志

慢查询日志便是系统在指令履行前后计算每条指令的履行时刻,当超过预设阈值,就将这条指令的相关信息(例如:发生时刻、耗时、指令的详细信息)记载下来。

Redis慢查询日志

Redis慢查询日志功用是用于记载履行时刻超过给定时长的指令恳求,能够经过查看慢查询日志来监控和优化查询速度。

Redis慢查询的损害

说到了Redis慢查询的损害,就会先说一下Redis的运行机制。

Redis客户端履行一条指令的步骤

Redis是单线程来处理指令,所以一条指令从客户端抵达服务端不会立即被履行,一切的指令都会进入一个队列,然后逐一被履行。

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

因此Redis服务端去履行操作的是能够首要以下几个步骤:

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

一切的指令都有先后次序,但是真实含义抵达服务端的履行次序也是不确定的,因为中间有网络传输。但是能够必定的是,不会有两条指令被同时履行,这样就不会发生并发问题,这便是Redis单线程的根本模型。

慢查询引发的问题
  1. 单线程机制:一切指令放在一个队列中
  2. Redis履行指令首要是在内存中履行、非IO堵塞、避免线程切换和竞态发生的消耗。

因为单线程的问题,一个指令不能履行太长时刻,不然会堵塞其他指令的履行。所以慢查询会形成整体的Redis服务的功用的下降以及CPU的耗时和负载变高。

注意:慢查询只会记载履行指令的时刻,没有慢查询并不代表客户端没有超时问题

阈值和慢查询的日志的设置

监控Redis指令的慢查询功用,需要明确两件事:

  1. 预设阈值怎样设置?
  2. 慢查询记载存放在哪里?

预设阈值怎样设置?

针对于慢查询的阈值,在Redis供给了slowlog-log-slower-thanslowlog-max-len装备来解决这两个问题。

阈值参数设置
慢查询履行时刻阈值
  • slowlog-log-slower-than:指定履行时刻超过多少微秒的指令会被记载到日志上,它的单位是微妙(1秒=1000毫秒=1000000微秒),默认值10000。

例如,该值设为100,履行了一条很慢的指令(例如 keys * ),假如它的履行时刻超过了100微秒,则这个指令会被记载到慢查询日志中。

慢查询数据存储阈值

慢查询日志最多存储多少条,并没有阐明存放在那里?首要经过slowlog-max-len进行操控和设置。从底层角度剖析,Redis运用了一个列表来存储慢查询日志,slowlog-max-log便是列表的最大长度。

  • slowlog-max-len:指定服务器上最多保存慢查询日志的条数。
    • slowlog-log-slower-than=0,那么系统会记载一切的指令
    • slowlog-log-slower-than<0,那么对任何指令都不会记载。

例如,该值设为5,那么指令履行时刻超过slowlog-log-slower-than设置的时刻的指令会被记载到慢查询日志上,假如慢查询日志的数量等于5,那么再增加慢查询日志时,需要把最早增加的慢查询日志删除,即慢查询日志删除选用先进先出的方法。

慢查询的装备类型和方法

Redis有两种修正装备的方法:1. 修正装备文件;2. config set指令动态修正。

例如,运用config set指令将slowlog-log-slower-than设置为20000微秒,slowlog-max-len设置为10000:

config set slowlog-log-slower-than 20000
config set slowlog-max-len 10000
config rewrite

假如要Redis将装备持久化到本地装备文件,要履行config rewrite指令,它会重写装备文件。

慢查询日志的操作指令

慢查询日志的的查询和保护首要是经过:slowlog get、slowlog len、slowlog reset这几条指令。

slowlog get [n]

慢查询日志有4个属性组成:日志id、发生时刻戳、指令耗时、履行指令和参数。

127.0.0.1:6379> slowlog get
1) 1) (integer) 1
   2) (integer) 1513709400
   3) (integer) 11
   4) 1) "slowlog"
      2) "get"
2) 1) (integer) 0
   2) (integer) 1513709398
   3) (integer) 4
   4) 1) "config"
      2) "set"
      3) "slowlog-log-slower-than"
      4) "2"

slowlog len

获取慢查询日志列表当时的长度

127.0.0.1:6379> slowlog len
(integer) 2

上面则阐明当时的满查询列表中至于连个慢查询日志。

slowlog reset

实际是对慢查询日志列表做整理操作。

127.0.0.1:6379> slowlog len
(integer) 6
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog len
(integer) 1

为什么还有1个,因为阈值设的比较小,slowlog reset就属于慢查询。