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道真题和解析
点赞 评论 收藏
分享
03-24 10:13
辽宁大学 Java
手撕两道 30min1.lc1190 反转每对括号间的子串2.数组实现高精度加法八股 30min1. 类加载机制2. jvm内存模型3. 介绍一下垃圾回收4. 垃圾回收算法,详细介绍一下5. stringbuffer和stringbuilder的区别6. java常见集合类7. hashmap底层原理8. 红黑树有什么特点,为什么用红黑树不用别的树9. hash是线程安全的吗,怎么实现线程安全10. concurenthashmap原理11. hashmap有记录插入顺序吗,假如我put 一个A,B,C进去然后我用for去循环他的话,他能A,B,C输出出来吗12. 如果我想维护这个插入顺序的话应该怎么办13. 线程池原理14. threadlocal是什么15. 使用threadlocal的时候需要注意什么16. IOC原理17. spring中的bean是什么18. 介绍一下spring中常见的注解19. MySQL查询很慢的话,怎么优化20. 最左匹配原则21. 索引ABC,where CBA能用上吗22. MySQL三大日志23. Redis分布式锁原理24. 一个服务通过redis抢到锁了是吧?嗯,然后这个服务挂了,那这个锁一直一直在那里,那怎么办呢?25. redis如果挂了它重启的话,里面的数据会丢失吗?26. Redis持久化27. 缓存击穿和缓存穿透28. 布隆过滤器它的原理是什么29. 说一下你在这个项目中啊遇到的一些比较比较麻烦的一些问题,还有是怎么解决的30. RAG这个方式有什么优缺点?31. 你在使用那个大模型的那个过程中有没有遇到过这种问题?就是说想希望它稳定的输出这种这一种格式
isolate9:是hr与管理线么
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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