当前位置: 代码网 > it编程>数据库>Redis > Spring redis使用报错Read timed out排查及解决过程

Spring redis使用报错Read timed out排查及解决过程

2024年05月18日 Redis 我要评论
使用场景我们使用redis作为缓存服务,缓存一些业务数据,如路口点位信息、渠化信息、设备信息等有一些需要实时计算的数据,缓存在redis里,如实时信号周期相位、周期内过车数量等有需要不同服务访问的数据

使用场景

  • 我们使用redis作为缓存服务,缓存一些业务数据,如路口点位信息、渠化信息、设备信息等
  • 有一些需要实时计算的数据,缓存在redis里,如实时信号周期相位、周期内过车数量等
  • 有需要不同服务访问的数据,使用redis作为共同可访问操作的缓存空间

报错信息

  • 在数据库数据变动时,需要清楚redis里的缓存,等下次查询需要时从数据库查询,再写入redis
  • 此时删除数据报错,核心报错信息read timed out,连接超时

    在这里插入图片描述

  • 检查了下,redis服务正常
  • 具体报错信息,分两个时间点的报错,(截取部分)如下:
  • 报错日志一jedisconnectionexception:
2023-03-29 10:54:38.186 error 9136 --- [ntainer#7-0-c-1] c.n.r.service.intersectionqueryservice   : exception in getintersectionbyid() with cause = 'redis.clients.jedis.exceptions.jedisconnectionexception: java.net.sockettimeoutexception: read timed out' and exception = 'java.net.sockettimeoutexception: read timed out; nested exception is redis.clients.jedis.exceptions.jedisconnectionexception: java.net.sockettimeoutexception: read timed out'

org.springframework.data.redis.redisconnectionfailureexception: java.net.sockettimeoutexception: read timed out; nested exception is redis.clients.jedis.exceptions.jedisconnectionexception: java.net.sockettimeoutexception: read timed out
	at org.springframework.data.redis.connection.jedis.jedisexceptionconverter.convert(jedisexceptionconverter.java:65)
	at org.springframework.data.redis.connection.jedis.jedisexceptionconverter.convert(jedisexceptionconverter.java:42)
	at org.springframework.data.redis.passthroughexceptiontranslationstrategy.translate(passthroughexceptiontranslationstrategy.java:44)
	at org.springframework.data.redis.fallbackexceptiontranslationstrategy.translate(fallbackexceptiontranslationstrategy.java:42)
	at org.springframework.data.redis.connection.jedis.jedisconnection.convertjedisaccessexception(jedisconnection.java:187)
	at org.springframework.data.redis.connection.jedis.jedisconnection.dowithjedis(jedisconnection.java:802)
  • 报错日志二 error while validating pooled jedis object:
2023-08-24 09:44:23.721 error 92250 --- [ns-pool-evictor] redis.clients.jedis.jedisfactory         : error while validating pooled jedis object.

redis.clients.jedis.exceptions.jedisconnectionexception: java.net.sockettimeoutexception: read timed out
	at redis.clients.jedis.util.redisinputstream.ensurefill(redisinputstream.java:205)
	at redis.clients.jedis.util.redisinputstream.readbyte(redisinputstream.java:43)
	at redis.clients.jedis.protocol.process(protocol.java:162)
	at redis.clients.jedis.protocol.read(protocol.java:227)
	at redis.clients.jedis.connection.readprotocolwithcheckingbroken(connection.java:352)
	at redis.clients.jedis.connection.getstatuscodereply(connection.java:270)
	at redis.clients.jedis.binaryjedis.ping(binaryjedis.java:380)
	at redis.clients.jedis.jedisfactory.validateobject(jedisfactory.java:214)
	at org.apache.commons.pool2.impl.genericobjectpool.evict(genericobjectpool.java:745)
	at org.apache.commons.pool2.impl.basegenericobjectpool$evictor.run(basegenericobjectpool.java:160)

解决方式

  • 报错信息很明显,“read timed out”超时错误,通常会有以下几种可能:
  • 1、redis服务端问题导致无法连接或连接出现问题,可以通过检查redis服务端日志或查看redis服务器状态来确认
  • redis未正常在运行,异常终止,或者启动失败
  • 未正确在程序里配置连接ip端口参数,例如ip错误使用localhost,又不在一台机器上
  • 2、 网络连接不稳定或延迟导致redis连接超时。可以尝试更改网络环境或增加redis客户端连接超时时间。
  • 检查程序服务于redis之间的网络是否联通,是否存在明显延迟
  • 可以修改spring redis配置参数,增加连接超时时间
  • redis服务器负载过高或使用redis的其他应用程序占用了太多的资源,导致redis无法响应请求。可以通过检查redis服务器的负载或性能参数来确定是否存在此问题。

  • 检查服务器情况,确保内存和磁盘空间充足,检查已使用内存、剩余内存、已使用磁盘、剩余磁盘等
  • 简单来说,你的服务对redis的使用频率,如果读写很高很频繁、数据内容很多,就提供比较好的服务器,或者搭建redis集群
  • 也可以优化spring redis配置参数,增加最大线程数、空闲线程数、连接超时时间等
  • 应用程序本身存在性能瓶颈或异常,导致redis的操作时间过长。可以检查应用程序代码和运行日志,查找可能导致性能问题的因素

  • 如果比较大的集合对象在redis存取,会占用很多内存,高并发情况下,可能做不到及时响应,可以只缓存必要的字段属性
  • 大量的key值,同时加到redis里面,又在一段时间后同时失效,造成瞬时压力过大,这要在业务上做一些随机失效时间
  • 针对以上情况,我们可以使用不同的解决方法来解决问题。例如,可以优化redis服务器的配置和设置,更改redis客户端连接超时时间,或调整应用程序性能等。
  • 我们此次检查后的改动如下:
spring:
  redis:
    jedis:
      pool:
        min-idle: 10
        max-idle: 300  # 改大了
        max-wait: 30000  # 改大了
        max-active: 200  # 改大了
  • 对应到我们的docker-compose.yml
  core-app:
    image: june
    container_name: core
    volumes:
      - /etc/localtime:/etc/localtime
    depends_on:
      - postgresql
      - redis
    environment:
      - _java_options=-xmx6g -xms1g
      - server_port=8181
      - spring_profiles_active=prod,api-docs,no-liquibase
      - spring_datasource_url=jdbc:postgresql://postgresql:5432/core
      - spring_datasource_username=xxxx
      - spring_datasource_password=xxxxxxx
      - spring_redis_host=redis
      - spring_redis_password=xxxxxxxx
      - spring_redis_jedis_pool_maxidle=300 # redis配置
      - spring_redis_jedis_pool_maxwait=30000
      - spring_redis_jedis_pool_maxactive=200
    restart: on-failure

总结

到此这篇关于spring redis使用报错read timed out排查及解决过程的文章就介绍到这了,更多相关spring redis报错read timed out内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • 如何利用Redis List实现Java数据库分页快速查询

    如何利用Redis List实现Java数据库分页快速查询

    前言在大型应用中,数据库分页查询是日常开发中不可避免的需求之一。随着数据量的不断增加,传统的数据库分页方式可能会变得效率较低。为了解决这一问题,本文将介绍如何使... [阅读全文]
  • Redis哨兵模式的实现

    1、哨兵简介master宕机场景的处理:问题:怎么确认master确实宕机了?(中间断网1s就认为人挂了不合适)怎么找一个slave来暂替master?旧的master恢复以后怎么…

    2024年05月18日 数据库
  • Java实现多级缓存的方法详解

    Java实现多级缓存的方法详解

    对于高并发系统来说,有三个重要的机制来保障其高效运行,它们分别是:缓存、限流和熔断。而缓存是排在最前面也是高并发系统之所以高效运行的关键手段,那么问题来了:缓存... [阅读全文]
  • Redis 布隆过滤器的原理和实践教程

    Redis 布隆过滤器的原理和实践教程

    背景介绍  布隆过滤器可以帮助我们解决redis缓存雪崩的问题,那什么是布隆过滤器、布隆过滤器又是如何使用如何解决缓存雪崩的问题的,让我们带... [阅读全文]
  • 虚拟机下的Redis无法访问报错500解决方法

    idea下的springboot项目存储数据到redis失败:由于我的redis是在虚拟机下安装的,无法访问redis的原因是因为虚拟机的ip地址和主机不同,当我直接使用local…

    2024年05月18日 数据库
  • Redis使用布隆过滤器解决缓存雪崩的问题

    背景介绍布隆过滤器可以帮助我们解决redis缓存雪崩的问题,那什么是布隆过滤器、布隆过滤器又是如何使用如何解决缓存雪崩的问题的,让我们带着这一系列的问题去详细了解布隆过滤器。概念说…

    2024年05月18日 数据库

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com