Redis慢查询

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis采用单线程串行执行命令的核心架构,任何执行耗时超预设阈值的命令都会被定义为慢查询。慢查询不仅会拖慢单条命令响应,还会阻塞后续所有命令排队,直接引发Redis整体性能卡顿、连接超时等问题,是Redis性能排查的核心抓手。本文从原理、配置、操作、排查、优化五大维度,全面拆解Redis慢查询相关知识。

一、Redis慢查询底层运行原理

1.1 慢查询核心定义

慢查询是Redis内置的日志机制,专门记录命令实际执行耗时超过设定阈值的操作。注意:慢查询仅统计命令在Redis服务端的执行时间,不包含网络传输耗时、客户端排队等待时间,因此网络延迟导致的响应慢不属于慢查询范畴。

1.2 慢查询生命周期

Redis慢查询采用内存FIFO队列存储日志,生命周期分为4步:

  1. 客户端发送命令至Redis服务端,命令进入执行队列排队
  2. Redis单线程取出命令,开始执行并计时
  3. 命令执行完毕,对比耗时与慢查询阈值:若超时则写入慢查询队列;未超时则直接丢弃日志
  4. 队列达到最大长度后,新日志会覆盖最旧的日志,避免内存溢出

慢查询日志仅存在于内存中,重启Redis后日志会全部丢失,生产环境建议定期持久化慢查询数据用于监控溯源。

1.3 慢查询日志核心字段

每条慢查询日志包含4个核心信息,是排查问题的关键依据:

  • 日志ID:唯一标识,自增序号
  • 执行时间戳:命令开始执行的时间点
  • 命令耗时:单位为微秒(1秒=1000000微秒)
  • 命令详情:完整执行命令+参数,部分版本包含客户端IP、端口信息

二、慢查询核心配置参数详解

Redis慢查询通过2个核心参数控制行为,支持配置文件永久生效运行时动态修改两种方式,无需重启Redis。

slowlog-log-slower-than

慢查询阈值,单位微秒

10000(10毫秒)

1000(1毫秒)

设为0表示记录所有命令,设为负数表示关闭慢查询

slowlog-max-len

慢查询队列最大长度

128

1000-5000

队列满后新日志覆盖旧日志,不宜设置过大避免占用内存

2.1 配置生效方式

方式1:配置文件永久修改(redis.conf)

# 慢查询阈值1毫秒
slowlog-log-slower-than 1000
# 慢查询队列最大长度2000
slowlog-max-len 2000

方式2:运行时动态修改(redis-cli)

# 连接Redis
redis-cli -h 主机IP -p 端口 -a 密码
# 动态调整阈值
CONFIG SET slowlog-log-slower-than 1000
# 动态调整队列长度
CONFIG SET slowlog-max-len 2000
# 查看配置是否生效
CONFIG GET slowlog*

三、慢查询日志查看与管理命令

Redis提供专属命令操作慢查询日志,无需依赖第三方工具,运维效率极高。

  • SLOWLOG LEN:查看当前慢查询日志的总条数,快速判断是否有大量慢命令堆积
  • SLOWLOG GET [N]:查看最近N条慢查询日志,不填N默认返回全部日志,建议指定N避免输出过多
  • SLOWLOG RESET:清空所有慢查询日志,排查完毕后可执行清理,释放内存
# 查看慢查询总条数
127.0.0.1:6379> SLOWLOG LEN
(integer) 5

# 查看最近3条慢查询
127.0.0.1:6379> SLOWLOG GET 3
1) 1) (integer) 5
   2) (integer) 1742345678
   3) (integer) 15000
   4) 1) "KEYS"
      2) "*"

# 清空慢查询日志
127.0.0.1:6379> SLOWLOG RESET
OK

四、生产环境慢查询实战排查步骤

按照“定位问题→分析原因→验证优化”的流程,快速定位慢查询根源,避免盲目调优。

步骤1:确认慢查询存在,提取高频慢命令

执行SLOWLOG GET命令,筛选耗时最长、出现频次最高的命令,重点关注KEYS、FLUSHALL、HGETALL、LRANGE、SMEMBERS等全量遍历类命令。

步骤2:分析慢命令根源

  • 全量遍历命令:无索引、无范围限制,遍历海量数据导致耗时
  • 大键操作:单个key存储海量数据(如大Hash、大List),读写耗时剧增
  • 复杂命令:管道滥用、事务阻塞、Lua脚本执行耗时过长
  • 资源竞争:Redis内存满、持久化阻塞、CPU抢占导致执行慢

步骤3:结合业务场景定位调用方

通过慢查询日志的命令详情,对接业务代码排查调用入口,定位是定时任务、接口逻辑还是第三方工具触发的慢命令。

步骤4:临时止损+永久优化

先通过kill命令终止耗时命令(Redis 5.0+支持CLIENT KILL),再针对性优化命令和数据结构,避免问题复发。

五、Redis慢查询根源优化方案

5.1 禁用/替换高危慢命令

  • 禁用KEYS *,替换为SCAN系列命令(HSCAN、SSCAN、ZSCAN)分批遍历
  • 避免使用FLUSHALL/FLUSHDB,如需清空数据采用分批删除
  • 限制LRANGE、SMEMBERS的范围,不一次性获取全量集合数据

5.2 拆分大键,优化数据结构

单个value大小建议控制在10KB以内,超大Hash/List拆分为多个小key;合理选择数据结构,比如用Hash替代String存储对象,用ZSet替代List实现有序队列。

5.3 优化Redis运行配置

  • 合理设置maxmemory,避免内存淘汰引发性能抖动
  • 开启AOF重写、RDB备份的低峰期执行,避免阻塞主线程
  • 调整慢查询阈值,精细化监控微小耗时命令

5.4 架构层面优化

集群部署分流压力,读写分离分担读请求;针对高频慢查询业务,增加本地缓存降级,减少Redis直接访问。

六、常见误区与避坑指南

  • 误区1:慢查询耗时=客户端响应时间。实际慢查询仅统计服务端执行时间,网络延迟、客户端排队需单独排查
  • 误区2:慢查询队列越长越好。队列过大会占用Redis内存,建议按业务量设置合理长度
  • 误区3:仅靠慢查询就能定位所有性能问题。Redis卡顿还可能是内存碎片、连接数满、持久化阻塞导致,需结合INFO命令综合分析
  • 误区4:动态修改配置后永久生效。运行时CONFIG SET重启后失效,关键配置需写入redis.conf

七、总结

Redis慢查询是定位性能瓶颈的核心工具,核心是合理配置阈值、定期监控日志、优化高危命令。生产环境建议搭建慢查询监控告警体系,实时发现慢命令,提前规避性能风险,保障Redis服务稳定运行。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis生产 文章被收录于专栏

聚焦Redis 生产环境实战,从问题现象、根因分析、排查流程、解决方案、预防机制五大维度,系统拆解 Redis 线上高频故障与性能瓶颈,提供可直接落地的运维、开发与调优方案,助力构建高可用、高性能、高可靠的 Redis 服务体系

全部评论

相关推荐

03-19 20:17
已编辑
东莞理工学院 Java
📍面试公司:淘米🕐面试时间:03/17💻面试岗位:golang服务端开发❓面试问题:1. 算法:给定一个只包含0和1的数组,最多可以操作n次,返回操作后最长连续1的长度。2. 实习相关内容有哪些?3. redis和MySQL相关知识4.Redis和MySQL的区别是什么5.redis和MySQL的事物区别6. 为什么MySQL要有redo log和undo log?7. Redis的原子性和MySQL的原子性有什么区别?8. Redis是怎么实现原子性的,可以回滚吗,为什么不设计一个回滚?9. Redis有隔离性吗?10. Redis的持久化和MySQL的持久化有什么区别?11. 为什么对于持久化数据要优先选择MySQL?12. MySQL的redo log和bin log职能不是差不多吗?为什么要分成两个呢?13. 如果让你设计,能否把redo log和bin log合并成一个?14. 合并的话数据结构怎么选择(STATEMENT和ROW)?15. 为什么选择混合模式?16. 你对游戏服务端开发了解多少?17. 游戏服务端开发和传统的后端开发有什么区别?18. 如果让你去写一个游戏的后端,需要注意什么问题?19. 游戏后端开发为什么要用长连接?20. 你是怎么使用AI相关技术的?21. 你开发时使用AI的流程是怎么样的?22. 引入了多个skill,你会怎么管理?23. 引入多个skill会触发什么问题?24. 你怎么理解agent?25. agent的调用流程是怎么样的?26. 你觉得agent有哪些地方可以优化?🙌面试感想:面试体验感一般般,面试官老是打断人说话,说的复杂了叫我说简单一点,说的简单了叫我按1234排列从头往后说详细一些,但是大部分问题还是答出来了,有一些问题问的也比较有价值有深度,好在是过了,明天hr面
查看26道真题和解析
点赞 评论 收藏
分享
面试时间:2h流程:笔试+面试,一面完光速拉二面面试官过来。1.索引有哪些类型?(聚蔟 非聚蔟,八股吟唱)2.如何判断哪些字段要加索引?(答的主键要加,有唯一约束的可以加,高频查询的列要加,经常用来order by排序的要加)3.什么情况下索引会不生效?(八股吟唱)4.一张学生表,里面有学生姓名,学生年龄等字段,重点关心学生姓名stu_name,如何查出重名的学生?(我答group by,没答对。)5.有一张学生成绩表,里面有学生姓名,课程名字,课程成绩,比如:张三,语文,80;张三,数学,60;如何查出所有成绩都>=80分的行数据?(兜兜转转后,我答的先用子查询查出,成绩<80分的行数据,并group by分组去重,再用这个子查询的临时表和主表进行比较,找出姓名重名的行数据,截去掉这些数据,得到的就是所有成绩>=80的优秀学生数据。面试官说思路没问题,我猜可能中间有点差错,因为我忘记group by的机制了)6.创建线程的方式有几种(三种,并开始八股吟唱ing)7.笔试里,是对单例模式没有思考吗?(我说笔试写的根本不是单例模式,写的单模板模式,我不敢写就没写,并背诵单例模式思路)8.除了单例模式,你还了解哪些设计模式?(以spring源码为基础,举出里面用到的设计模式,aop的代理模式与策略模式巴拉巴拉)9.如何实现登录的互踢?设备a在登录账户后,设备b也登录账户,需要设备a的账户被踢掉。(这个是我项目经历里的,我用的是redis中存token,同时加上随机值作为唯一标识,新设备登录账户,将同样token前缀的key删除,再把新设备的token存进去,前端隔一段时间检查用户登录状态,这样旧设备被检测token过期,被踢掉。)10.如果我先登录完,然后新开一个页签,我需要再进行登录一次吗?就是说,我的状态还在吗?(在,原因我不清楚,我当时说的因为浏览器做了缓存)11.网关是如何拦截请求,做白名单校验的?(项目经历里的,黑马的那一套,自定义请求拦截器写好白名单,网关拦截请求并对白名单进行匹配,从而判断是放行还是继续拦截做校验)12.非静态方法里能定义静态变量吗?(八股吟唱)-------------------------一面结束,十几分钟后二面面试官带着hr来了。13.遇到不好打交道的人应该怎么做?14.职业规划是啥,考研还是就业。15.说说自己的优缺点。16.讲讲你实习经历里的业务(最让我吐槽的一点,也不说是哪方面业务,不问实习产出,就让我讲一整个项目的业务流程,大哥这是我写了两三个月的项目啊,我从哪跟你讲起)17.对业务流程的一些追问(连拷打都算不上,就是像个用户一样问流程,我能不能提交多次啊?我能不能以个人身份参赛啊?工作流核心逻辑是调的远程接口吗?一个技术名词都没问)18.讲讲笔试题里的算法(hot100的非重复子串的最大长度,abcabc输出3,aaaa输出1)19.写一个你熟悉的排序(只记得二分,所以写的二分)20.反问环节总结:薪资110一天,问的感觉比我面的那些5k的都难,一面全是场景题,二面也不问产出全问业务。而且实习期间不让回学校写毕设,不保证转正,还查户口问我家庭情况。。。位置也偏僻,我过来一趟要两个半小时。看得起这薪资的过不去面试,过得了面试的看不上这薪资,可以去面试检验下自己的八股水平。ps:笔试也很难,一道hot100算法,两道编程题算输出结果,两道还是三道手写sql,其余的是八股题,其中一道还打错字了,单例模式写成单模板模式,boss上hr说笔试面试的淘汰率很高,我只能说难度确实大,但有没有可能别人也在淘汰你呢😂
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务