线上redis慢查询排查

摘要:
Slowlog存储在内存中,其读写速度非常快。因此,我们可以放心地使用它。我们不必担心Redis的速度,因为我们启用了慢日志。Slowlog log低于表示慢速查询的阈值,以微秒为单位。slowlog max len的默认值为128,保存在内存中。因此,重新启动Redis将清除慢速查询日志。配置slowlog log低于和slowlog max len的命令非常简单,如下所示:CONFIGSETslowlog日志低于100CONFIGSETSlowlog max len1024使用SLOWLOGLEN命令查询当前的慢速查询日志记录数。redisSrandmember命令的基本语法如下:SRANDMEMBERKEY[count]返回值:当只提供set key参数时,返回一个元素;如果集合为空,则返回nil。

一、背景

最近线上redis集群偶尔会有节点内存瞬间暴增,导致节点down掉情况,调整内存由32G扩增到64G,问题还是会出现,观察监控图发现服务器流量、IO都无明显波动

观察redis日志:

线上redis慢查询排查第1张

然后在查询慢日志的时候发现了猫腻:

线上redis慢查询排查第2张

  我们先来分析下慢日志的结果:

 1) 1) (integer) 10214                         #唯一性(unique)的日志标识符
    2) (integer) 1623374663                 #被记录命令的执行时间点,以 UNIX 时间戳格式表示
    3) (integer) 41027078                     #查询执行时间,以微秒为单位
    4) 1) "SRANDMEMBER"                    #执行的命令,以数组的形式排列
       2) "chatroom:r:rids:64234553"     #完整慢查询语句:SRANDMEMBER chatroom:r:rids:64234553 -183463424
       3) "-183463424"

结果分析完了,我们再来探讨下关于慢查询的知识:

二、慢查询

slowlog 是 Redis 用来记录查询执行时间的日志系统。注意,这个查询执行时间不包括像客户端响应(talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。 

slowlog 保存在内存里面,读写速度非常快,因此我们可以放心地使用它,不必担心因为开启 slowlog 而损害 Redis 的速度。

slowlog 有两个重要的配置,我们先通过 CONFIG GET slowlog-* 命令来查看现有的配置。

 线上redis慢查询排查第3张

slowlog-log-slower-than 代表慢查询的阈值,单位为:微秒。当执行查询命令消耗时间大于配置的阈值时,会将该条命令记录到慢查询日志。当 slowlog-log-slower-than=0 时,记录所有命令。slowlog-log-slower-than<0 时,不记录任何命令。slowlog-log-slower-than 的默认值为 10000 (10毫秒,1秒 = 1,000毫秒 = 1,000,000微秒)。

slowlog-max-len 代表慢查询日志最大条数。它是一个队列形式的存储结构,先进先出的队列,即当慢查询日志达到最大条数后,会销毁最早记录的日志条目。slowlog-max-len 的默认值为 128,保存在内存内,所以重启 redis 会清空慢查询日志。

配置 slowlog-log-slower-than 和 slowlog-max-len 的命令非常简单,如下:

CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1024

使用 SLOWLOG LEN 命令,查询当前的慢查询日志记录数。当我们只需要查询前几个慢查询记录时,可以使用 SLOWLOG GET [n] 命令。SLOWLOG GET [n] 若不加 n ,则获取全部慢查询记录。清空慢查询日志使用 SLOWLOG RESET。注意,slowlog-log-slower-than 不要设置过大,设置过大有可能一条记录也不会记录。

 三、Srandmember命令分析

Redis Srandmember 命令用于返回集合中的一个随机元素。

从 Redis 2.6 版本开始, Srandmember 命令接受可选的 count 参数:

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。

redis Srandmember 命令基本语法如下:

SRANDMEMBER KEY [count]

返回值:只提供集合 key 参数时,返回一个元素;如果集合为空,返回 nil 。 如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。

 四、总结

那么找到了慢查询语句,就等于抓到了大鱼,下一步就是让研发优化了

免责声明:文章转载自《线上redis慢查询排查》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇区间合并Java路径问题解决方案收集下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【JavaScript数据结构系列】02-栈Stack

【JavaScript数据结构系列】02-栈Stack码路工人 CoderMonkey转载请注明作者与出处 ## 1. 认识栈结构 栈是非常常用的一种数据结构,与数组同属线性数据结构,不同于数组的是它是一种受限的线性结构。 画一张图来说明: 如上图所示, 最新入栈的元素/最底下的元素,为栈底 最后一个/最上面的元素,为栈顶 最后一个入栈元素最先出栈(L...

Redis 使用指南:深度解析 info 命令

Redis 是一个使用  ANSI C 编写的开源、基于内存、可选持久性的键值对存储数据库,被广泛应用于大型电商网站、视频网站和游戏应用等场景,能够有效减少数据库磁盘 IO, 提高数据查询效率,减轻管理维护工作量,降低数据库存储成本。对传统磁盘数据库是一个重  要的补充,成为了互联网应用,尤其是支持高并发访问的互联网应用必不可少的基础服务之一。它的主要优势...

数组以及数组常用方法

1.什么是数组? 数组就是专门用来存储一组数据的 它不属于基本数据类型,这是初学者经常会犯的错误,基本数据类型在ES6之前只有Number/String/Boolean/Null/undefined 数组属于引用数据类型(对象类型) 2.如何创建数组? 第一种是通过new的方法创建一个数组的对象 let 变量名称 = new Array(数组长度); 第二...

JSON的数据格式

1. 什么是 JSON       JSON概念很简单,JSON 是一种轻量级的数据格式,他基于 javascript 语法的子集,即数组和对象表示。由于使用的是 javascript 语法,因此JSON 定义可以包含在javascript 文件中,对其的访问无需通过基于 XML 的语言来额外解析。不过在使用 JSON 之前,很重要的一点是理解 javas...

Vue中GET请求传递数组参数

如下GET请求传递一个数组参数 let params = { statusList: ['OVERDUE', 'DELAY'] } this.$http.get('/list', params) .then(res => {})...

VB可变数组定义

关键点:Dim str() As string '定义redim str(n) '重设长度 or redim Preserve str(n) '重设长度,并保持原来记录不变 详细阐述:ReDim 语句 在过程级别中使用,用于为动态数组变量重新分配存储空间。 语法 ReDim [Preserve] varname(subscripts) [As type]...