Redis 慢查询

发布于:2025-04-05 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、命令流程


二、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 *FLUSHALLHGETALL大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"

优化步骤:

  1.         检查 user:1001:profile 的Hash大小,若字段过多,拆分为多个Hash
  2.         使用HSCAN分页读取,避免一次性获取全部数据。

 


网站公告

今日签到

点亮在社区的每一天
去签到