redis慢查询分析

前言

redis是单线程操作,如果在redis中执行耗时较长的操作,就会阻塞其他请求了.

我们都知道mysql有慢查询日志,帮助开发运维人员定位系统存在的慢操作. 其实慢查询日志就是字面上的意思,系统在命令执行前后计算每条命令的执行时间.当超过预设阈值,就将这条命令相关信息记录下来.redis也有这个功能

redis客户端执行一条命令,分为4部分

redis慢查询分析

1> 发送命令

2>命令排队

3>命令执行

4>返回结果

慢查询在第三步,统计第三步执行时间

配置

slow log 是redis用来记录查询执行时间的日志系统

查询执行时间指的是不包括像客户端相应,发送回复等io操作.单单执行一个查询命令所耗费的时间

slow log 保存在内存中,读写速度快.不用担心因为开启slow log而损害redis速度

配置上, 修改redis.conf,当然也可以直接set,但是那样重启之后就没了, 主要两个参数

slowlog-log-slower-than: 执行时间大于多少微秒的查询进行记录.(1s=1000000微秒), 如果值设为0,就是所有的访问记录都会被记录下来.

slowlog-log-slower:最多能保存多少条日志,slow log本身是一个FIFO队列,当队列大小超过这个值,最旧的一条日志就被删除了.

测试

redis慢查询分析

redis慢查询分析

这里怎么来看:

虽然慢查询日志是存在redis内存列表中,但是redis没有暴露这个列表的键,是通过一组命令来实现对慢查询日志的访问和管理,

slowlog get 就是上面第二张图

我们来看标红的位置, 每个慢查询日志由4个属性组成. 分表是1)慢查询日志的标识id,2)发送时间戳,3)命令耗时,4)执行命令和参数.

redis服务器将所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表节点都包含一个slowlogEntry结构,每个slowlogEntry结构代表了一条慢查询日志. 打印和删除慢查询日志可以通过遍历slowlog链表来完成. slowlog链表的长度就是服务器所保存慢查询日志的数量.

我们来瞅瞅数据结构

redis慢查询分析

扩展

1.slowlog-max-len 配置方面: 显示可扩大慢查询列表

2.slowlog-log-slower-than 默认值超过10毫秒判断为慢查询,需要根据redis并发量调整该值,由于redis采用单线程相应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,redis最多可制成ops不到1000,所以高ops(operation per second 每秒操作次数)场景,建议设置在1毫秒

3.对于日志这个,线上建议定期存储到其他存储中,不然会丢.

4.由于命令执行是排队来的.所以慢查询会导致其他命令级联阻塞,当客户端出现请求超时时,需要检查该事件点是否有对应的慢查询,来分析是否为慢查询导致的命令级联阻塞