我们知道 MySQL 提供了慢查询日志帮助我们定位系统存在的慢操作,同样在 Redis 里面也提供了类似的功能。所谓慢查询日志就是系统记录那些执行时间超过预设阀值的命令,包括发生时间、耗时、命令的详细信息等相关信息都记录下来。
慢查询的作用:通过慢查询分析,找到有问题的命令进行优化。
Redis 执行命令分为四个步骤:发送命令、命令排队、执行命令、返回结果。需要注意的是,慢查询只统计步骤 3 的时间,所以没有慢查询并不代表客户端没有超时问题。
Redis 慢查询有两个参数需要配置:
slowlog-log-slower-than
:设置慢查询预设的超时阈值,单位是微秒slowlog-max-len
:表示慢查询日志存储的条数
slowlog-log-slower-than
slowlog-log-slower-than
表示的是慢查询预设的超时阈值。它所阐述的意思是如果某条命令(如 key *
) 执行”很慢“,执行时间超过了设置的阈值,那么这条命令将会被记录到慢查询日志中。
- 若设置
slowlog-log-slower-than = 0
,则会记录所有命令 - 若设置
slowlog-log-slower-than < 0
,则不会记录任何命令
slowlog-max-len
Redis 会记录慢查询日志,但是会存储在哪里呢?实际上 Redis 会使用一个列表来存储慢查询日志,slowlog-max-len
就是该列表的最大长度。一个命令如果满足慢查询阈值条件则会加入到该列表来,但是如果该列表已经处于最大长度时,那么会删除最开始的一条记录,然后将最新的命令插入到末尾,所以慢查询日志列表是一个有限的先进先出列表。
在 Redis 中有两种修改配置的方法,一种是修改配置文件,另一种是使用 config set
命令动态修改。下面我们将利用 config set
命令对这两个命令配置下。
config set slowlog-log-slower-than 0
config set slowlog-max-len 1024
config rewrite
slowlog-log-slower-than
设置为 0 , slowlog-max-len
设置为 1024,config rewrite
表示将配置持久化到配置文件中。
- 获取慢查询日志
slowlog get [n]
参数 n 表示展示的条数,如下:
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 3
2) (integer) 1582721437
3) (integer) 888
4) 1) "set"
2) "key1"
3) "value1"
5) "127.0.0.1:55842"
6) ""
可以看出返回的慢查询日志由 4 个属性组成:
1)日志的标识 id 2)发生的时间戳 3)命令耗时 4)执行的命令和参数
- 获取慢查询列表长度
slowlog len
- 清空日志列表
# 如果慢查询设置的阀值是0,那么再查询len的时候为1。
slowlog reset
最佳实践
慢查询功能可以有效地帮助我们找到 Redis 可能存在的瓶颈,但在实际使用过程中要注意以下几点:
slowlog-log-slower-than
:默认是 10 毫秒,我们需要根据 Redis 的并发量调整该值。若我们采用默认,那么命令的执行时间要超过 10 毫米才会记录,如果命令的执行时间超过 10 毫秒,那么 Redis 的 QPS 连 100 都不到,因此对于高并发场景,建议将该值设置较小。slowlog-max-len
:线上建议调大慢查询列表,记录慢查询时Redis会对长命令做阶段操作,并不会占用大量内存.增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上。- 慢查询只记录命令的执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令的实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞。
参考
- 《Redis 开发与运维》
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。