线上Redis超时问题排查

问题描述

最近线上的程序经常报错,redis command timed out 报错信息如下

org.springframework.dao.QueryTimeoutException: Redis command timed out; 
nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 1 second(s)         
at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:70)         
at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41)         
at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44)         
at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42)

从错误信息初步判断是redis的命令执行超时,超过了一秒,因为程序中配置的命令执行超时时间为1秒,所以执行超过一秒程序就会报timed out,程序配置如下:

spring.redis.timeout: 1000

通过上面的分析,去到redis服务器上查看redis慢日志,发现有不少慢日志,其中的keys  命令特别多

下面图片中每一个日志的第三行是命令执行时间,单位为微妙

通过redis慢查询日志看到大量的keys 命令的使用,keys命令会遍历redis集合,是一个非常耗时的操作,线上应该禁止使用此操作,通过业务排查发现有一个业务还使用了keys 命令来过滤数据

到处,问题基本就清楚了,由于线上代码中使用了keys 命令来过滤key keys命令类似与数据库的全表扫描,会遍历redis中的所有数据,而redis的work线程又是单线程的,这个命令执行时间过长会阻塞其他正常命令的执行,导致其他命令执行超时,出现前面问题中的timed out 异常。

二 解决方案

  1. 首先开发人员应该了解keys 命令的影响,平时禁止使用keys 命令,特别是线上环境
  2. 开发人员禁止使用redis desktop manager 这样的redis 界面工具连接线上环境(因为这类工具会通过keys * 来加载全量数据到本地)
  3. 各开发人员排查代码中使用keys 命令的情况,尽快改掉
  4. 必须在redis 服务器上禁止keys 这样不安全的命令的使用,还有flushdb flushall等操作

三 Redis配置还存在的问题

检查来一下我们线上redis 的配置信息,有两处存在比较大的风险

  1. maxmemory 未指定redis可以使用的内存大小,当物理内存不够时会使用磁盘swap区,性能会严重下降,建议根据redis部署的服务器内存大小设置合理的值
  2. maxmemory_policy 未指定内存驱逐策略,当redis内存使用满之后,如果没配置驱逐策略会导致redis服务僵死,所有连接无法访问,并且无法正常恢复,只能通过重启才会恢复正常。

参考redis 配置说明  https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值