美文网首页
spring boot 操作redis的首次连接慢的问题

spring boot 操作redis的首次连接慢的问题

作者: 天草二十六_简村人 | 来源:发表于2022-10-31 14:39 被阅读0次

一、问题背景

  • 采样接口的平均耗时2.4s,调用次数为2次。

注意,左侧的接口响应时间是指平均响应时间。(这一点很多大佬都吐槽过,不知道为什么他们死活不改)

image.png 响应时间和调用次数.png
  • 从第二张图,也可以印证该接口的调用次数和响应耗时,个人觉得,左侧的接口响应时间应该换为P90线的响应时间。

原因是:在调用调用量大的时候, 耗时为4.2秒的请求会被淹没,在左侧接口列表中发现不了耗时慢的。

查看最近6小时,耗时慢的接口调用都被淹没了吧.png

二、发现问题

该服务在重启后,第一次调用是在2022-10-28 13:48:43,耗时4.2秒;第二次调用是在2022-10-28 13:48:45,耗时降低至576毫秒。

  • 响应时间为什么会相差这么大??


    image.png
如果方法栈不足以定位代码问题,请继续查看线程剖析结果.png 耗时4.2秒.png 耗时576毫秒.png
  • 看下耗时大的1800毫秒,慢在哪个方法


    image.png

io.lettuce.core.RedisClient.connect( ):207 [1400ms]
可以看到,程序和redis的连接耗时1400毫秒。 在第二次及以后就不用再进行redis连接了,所以接口的耗时一下子就降下去了。

  • 不知道为什么arms的实际耗时是4244毫秒,而监听耗时却是2300毫秒。增加的那2秒跑哪里去了??

三、总结

我们都知道,程序在和数据库建立连接的时候,是最耗时的。希望本文能够给你一个直接的耗时慢的体验现场。

  • 在配置redis连接池(包括mysql等数据库),特别关注它的连接数

四、附录

  • redis配置
# 连接超时时间
spring.redis.timeout=5000
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=3
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=2
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=3
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
#在关闭客户端连接之前等待任务处理完成的最长时间,在这之后,无论任务是否执行完成,都会被执行器关闭,默认100ms
spring.redis.lettuce.shutdown-timeout=100
  • spring boot 默认使用的redis连接组件是luttuce,而不是jedis
# 下面是无效的配置
  redis:
    jedis:
      pool:
        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 10      # 连接池中的最大空闲连接
        min-idle: 5       # 连接池中的最小空闲连接

相关文章

网友评论

      本文标题:spring boot 操作redis的首次连接慢的问题

      本文链接:https://www.haomeiwen.com/subject/dafltdtx.html