一、命令流程
二、Redis慢查询
1、慢查询值指是什么
- redis命令的执行时间
- 记录内容: 执行时间超过预设阈值( slowlog-log-slower-than )的命令。
- 存储方式:基于内存的固定长度队列(通过 slowlog-max-len 配置),以先进先出(FIFO)方式管理。
- 超出配置长度,弹出最早插入的那条数据
- 不记录的情况:仅记录实际执行时间,不包括网络传输,排队等待耗时。
2、慢查询的阈值
参数 默认值 说明
slowlog-log-slower-than
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分页读取,避免一次性获取全部数据。