实战步骤:1. 配置慢日志阈值:在redis.conf中设置slowlog-log-slower-than 10000(单位微秒),slowlog-max-len 128。然后重启Redis或用CONFIG SET命令动态设置。2. 查看慢日志:SLOWLOG GET 10 显示最近10条慢查询,包括时间戳、执行时间、命令详情。3. 分析瓶颈:用SLOWLOG GET找出耗时命令,如大KEY的KEYS *或复杂SORT,优化为SCAN或管道批量操作。4. 监控提升:结合INFO commandstats实时统计命令耗时,调整业务逻辑减少阻塞命令。示例代码:redis-cli --latency -h 127.0.0.1 -p 6379 测试延迟;SLOWLOG RESET清空日志。优化后响应速度提升30%以上。
开启Redis慢查询日志
Redis的慢查询日志是排查性能问题的重要工具。通过slowlog-log-slower-than参数设置阈值,例如设置为80000微秒(80毫秒),表示超过这个时间的命令会被记录。slowlog-max-len设置日志长度,默认128条。动态开启:CONFIG SET slowlog-log-slower-than 80000;CONFIG SET slowlog-max-len 1000。重启后日志自动生效。
查看和分析慢日志
使用SLOWLOG GET [n]命令查看慢日志,n为条数,不填默认10条。每条日志包含id、时间戳、执行耗时、命令数组。例如:1) 1) (integer) 1583012345 2) (integer) 123456 3) (integer) 5 4) 1) "KEYS" 2) "*"。这里KEYS *命令耗时123毫秒,是典型大key问题。
常见慢查询命令及优化
1. KEYS *: 避免使用,在生产环境用SCAN迭代。2. SMEMBERS大集合:用SSCAN分页获取。3. 大key的HGETALL:用HSCAN。4. Lua脚本阻塞:拆分或用pipeline。5. MSET/MGET海量key:分批执行。优化示例:scan 0 MATCH user:* COUNT 100。
监控工具结合慢日志
用redis-cli MONITOR实时捕获命令,或INFO stats查看命中率。结合Prometheus+Grafana监控慢日志指标。脚本示例:#!/bin/bash redis-cli slowlog get 100 | awk '{print $3}' | sort -nr | head -10 显示Top10慢命令。
慢日志实战案例
某电商系统Redis响应变慢,SLOWLOG显示大量ZREVRANGEBYSCORE耗时>200ms。原因是ZSET有序集过大(10万元素)。优化:引入热点数据缓存层+布隆过滤器,减少ZSET访问;用pipeline批量查询。结果QPS提升2倍,P99延迟降至50ms。
高级排查技巧
1. SLOWLOG GET 999999导出全日志到文件分析。2. redis-cli --stat观察内存碎片。3. LATENCY DOCTOR诊断潜在问题,如bigkeys。4. 主从复制延迟检查:INFO replication。5. AOF/RDB持久化调优:appendfsync everysec。
FAQ
Q: 如何动态调整慢日志阈值?
A: 用CONFIG SET slowlog-log-slower-than 50000立即生效,无需重启。
Q: 慢日志满了怎么办?
A: SLOWLOG LEN查看长度,SLOWLOG RESET清空;调大slowlog-max-len。
Q: KEYS命令为什么慢?
A: 全遍历key空间,O(N)复杂度;用SCAN 0 COUNT 100分页。
Q: 怎么监控慢日志?
A: 用redis-sentinel或第三方如redis-exporter集成Grafana dashboard。