提供了 5 种数据结构, 但除此之外,
- Redis
还提供了注入慢查询分析,
- Redis
、
- Redis Shell
、事务、与
- Pipeline
脚本、
- Lua
、
- Bitmaps
、
- HyperLogLog
、
- PubSub
等附加功能, 这些功能可以在某些场景发挥很重要的作用.
- GEO
许多存储系统 (如:
)提供慢查询日志帮助开发与运维人员定位系统存在的慢操作. 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间, 当超过预设阈值, 就将这条命令的相关信息 (例如: 发生时间, 耗时, 命令的详细信息) 记录到慢查询日志中,
- MySQL
也提供了类似的功能.
- Redis
命令执行流程:
- Redis
需要注意, 慢查询只统计步骤
的时间, 所以没有慢查询并不代表客户端没有超时问题.
- 3
对于慢查询功能, 需要明确两件事:
提供了
- Redis
和
- slowlog-log-slower-than
配置来解决这两个问题. 从字面意思就可以看出,
- slowlog-max-len
就是这个预设阈值, 它的单位是毫秒 (
- slowlog-log-slower-than
) 默认值是
- 1秒=1000000微秒
, 假如执行了一条 "很慢" 的命令 (例如
- 10000
), 如果执行时间超过
- key *
, 那么它将被记录在慢查询日志中.
- 10000微秒
如果
会记录所有命令,
- slowlog-log-slower-than=0
对于任何命令都不会进行记录.
- slowlog-log-slower-than<0
从字面意思看,
只是说明了慢查询日志最多存储多少条, 并没有说明存放在哪里? 实际上
- slowlog-max-len
使用了一个列表来存储慢查询日志,
- Redis
就是列表的最大长度. 一个新的命令满足慢查询条件时被插入到这个列表中, 当慢查询日志列表已处于其最大长度时, 最早插入的一个命令将从列表中移出, 例如
- slowlog-max-len
设置长度为
- slowlog-max-len
. 当有第
- 64
条慢查询日志插入的话, 那么队头的第一条数据就出列, 第
- 65
条慢查询就会入列.
- 65
在
中有两种修改配置的方法, 一种是修改配置文件, 另一种是使用
- Redis
命令动态修改. 例如下面使用
- config set
命令将
- config set
设置为
- slowlog-log-slower-than
.
- 20000微妙
设置为
- slowlog-max-len
:
- 1024
- config set slowlog-log-slower-than 20000
- config set slowlog-max-len 1024
- config rewrite
如果需要将
将配置持久化到本地配置文件, 要执行
- Redis
命令. 如下:
- config rewrite
虽然慢查询日志存放在
内存列表中, 但是
- Redis
并没有暴露这个列表的键, 而是通过一组命令来实现对慢查询日志的访问和管理.
- Redis
(1) 获取慢查询日志
- slowlog get [n]
参数
可以指定条数.
- n
例:
- 127.0.0.1:6370> slowlog get
- 1) 1) (integer) 666
- 2) (integer) 1456786500
- 3) (integer) 11615
- 4) 1) "BGREWRITEAOF"
- 2) 1) (integer) 665
- 2) (integer) 1456718400
- 3) (integer) 12006
- 4) 1) "SETEX"
- 2) "video_info_200"
- 3) "300"
- 4) "2"
- ...
可以看到每个查询日志有 4 个属性组成, 分别是慢查询日志的表示
、发生时间戳、命令耗时、执行命令和参数, 慢查询列表:
- id
(2) 获取慢查询日志列表当前长度
- slowlog len
例如, 当前
中有
- Redis
条慢查询:
- 45
- 127.0.0.1:6370> slowlog len
- (integer) 23
(3) 慢查询日志重置
- slowlog reset
实际是对列表做清理操作, 例如:
- 127.0.0.1:6370> slowlog len
- (integer) 23
- 127.0.0.1:6370> slowlog reset
- OK
- 127.0.0.1:6370> slowlog len
- (integer) 0
慢查询功能可以有效地帮助我们找到
可能存在的瓶颈, 但在实际使用过程中要注意以下几点:
- Redis
: 线上建议调大慢查询列表, 记录慢查询时
- slowlog-max-len
会对长命令做阶段操作, 并不会占用大量内存. 增大慢查询列表可以减缓慢查询被剔除的可能, 例如线上可设置为
- Redis
以上.
- 1000
: 默认值超过
- slowlog-log-slower-than
毫秒判定为慢查询, 需要根据
- 10
并发量调整该值. 由于
- Redis
采用单线程相应命令, 对于高流量的场景, 如果命令执行时间超过
- Redis
毫秒以上, 那么
- 1
最多可支撑
- Redis
不到
- OPS
因此对于高 OPS 场景下的
- 1000
建议设置为
- Redis
毫秒.
- 1
命令将慢查询日志持久化到其他存储中 (例如:
- slowlog get
、
- MySQL
等), 然后可以通过可视化工具进行查询.
- ElasticSearch
来源: http://www.tuicool.com/articles/b6bQBfn