1、慢查询值指是什么
- redis命令的执行时间
- 记录内容: 执行时间超过预设阈值( slowlog-log-slower-than )的命令。
-
存储方式:基于内存的固定长度队列(通过 slowlog-max-len 配置),以先进先出(FIFO)方式管理。
- 超出配置长度,弹出最早插入的那条数据
- 不记录的情况:仅记录实际执行时间,不包括网络传输,排队等待耗时。
2、慢查询的阈值
参数 | 默认值 | 说明 |
---|---|---|
|
10毫秒 | 执行时间超过此值的命令会被记录。设为0 记录所有命令,-1 关闭记录。 |
slowlog-max-len |
128 | 慢查询日志的最大条数。超出时旧日志被删除。 |
3、两种方法进行设置
- 动态设置:无需重启。 (.bash文件)
-
CONFIG SET slowlog-log-slower-than 20000 # 设为20毫秒 CONFIG SET slowlog-max-len 500 # 存储500条日志
-
- 持久化配置:修改 redis.conf 文件并重启
4、查看与分析慢查询日志
-
查看日志
-
SLOWLOG GET [n] # 获取最近的n条记录(不指定n则返回全部)
-
-
日志字段说明
-
(integer) 3 # 日志唯一ID (integer) 1630456789 # 执行时间戳(Unix时间) (integer) 15000 # 执行耗时(微秒) a、 "KEYS" # 命令及其参数 b、"user:*"
-
5、常见慢查询场景与优化
典型场景:
-
大Key操作:如读取10MB的String(
GET huge_key
)。 -
复杂命令:
KEYS *
、FLUSHALL
、HGETALL
大Hash。 -
批量操作:一次性删除百万级成员的集合(
DEL big_set
)。 -
Lua脚本:执行时间过长的脚本。
优化建议:
-
避免大Key:拆分Key(如将大Hash拆分为多个小Hash)。
-
替代危险命令:用
SCAN
代替KEYS
,用HSCAN
代替HGETALL
。 -
管道与批量操作:减少网络往返,但避免单次批量过大。
-
监控Lua脚本:确保脚本逻辑高效,避免长时间执行。
6、辅助工具与命令
-
清空日志:
-
SLOWLOG RESET
- slowlog reset命令用于清空慢查询日志,它没有任何参数或选项。执行该命令后,redisServer.slowlog_entry_id的值将被重置为0,所有慢查询日志都将被删除
-
-
仅获取日志数量:
-
SLOWLOG LEN
-
-
性能分析工具:
-
redis-cli --latency
:检测网络延迟。 -
MONITOR
:实时查看所有命令(谨慎使用,影响性能)。
-
示例:
SLOWLOG GET 1
1) 1) (integer) 12
2) (integer) 1630500000
3) (integer) 25000 # 25毫秒
4) 1) "HGETALL"
2) "user:1001:profile"
优化步骤:
- 检查 user:1001:profile 的Hash大小,若字段过多,拆分为多个Hash
- 使用HSCAN分页读取,避免一次性获取全部数据。