Spring Boot/Spring Cloud中Redis报错Connection reset

简介: 本文目录1. 现象2. 思路3. 实现4. 实验

1. 现象

Spring Cloud项目,使用的JRedis连接池,日志里面经常会发现报错信息如下:


Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset

at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)

at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)

at redis.clients.jedis.Protocol.process(Protocol.java:153)

at redis.clients.jedis.Protocol.read(Protocol.java:218)

at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:341)

at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:240)

at redis.clients.jedis.BinaryJedis.quit(BinaryJedis.java:256)

at org.springframework.data.redis.connection.jedis.JedisConnection.close(JedisConnection.java:298)

... 38 common frames omitted

Caused by: java.net.SocketException: Connection reset

at java.net.SocketInputStream.read(Unknown Source)

at java.net.SocketInputStream.read(Unknown Source)

at java.net.SocketInputStream.read(Unknown Source)

at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)


Connection reset表示连接被重置,具体含义是服务器端因为某些原因关闭了Connection,这肯定是跟连接的数量、超时时间等相关。


2. 思路

网上查询相关资料,了解到JRedis在多线程情况下共享一个实例是不安全的,所以是一个很大的隐患。而且JRedis也不能较好的支持较多的连接数。


所以问题应该是出在连接池上,JRedis在多线程高并发的情况下,是一个定时炸弹,竟然如此,换掉就是了。


继续查询资料,找到了基于Netty的Lettuce,看到Netty就放心了,有点资历的程序猿都知道是高性能高并发的绝佳带盐。


3. 实现

首先引入相关依赖:


<!-- redis -->

 <dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-redis</artifactId>

 </dependency>

 <!-- lettuce pool 缓存连接池 -->

 <dependency>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-pool2</artifactId>

 </dependency>


然后配置连接参数:


spring:

 # redis配置信息

 redis:

   # redis数据库索引(默认为0)

   database:  0

   # redis服务器地址  

   host:  192.168.20.214

   # redis服务器连接端口  

   port:  6379

   password:

   lettuce:

     pool:

       max-total: 100

       max-active: 100

       max-wait:  1000

       max-idle:  20

       min-idle:  0


最后使用配置类:


/**

* redis配置类

*/

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {

@Bean

public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

 RedisTemplate<String, Object> template = new RedisTemplate<>();

 // 连接工厂

 template.setConnectionFactory(factory);

 // 使用Jackson2JsonRedisSerializer

 Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<Object>(Object.class);

 ObjectMapper om = new ObjectMapper();

 // 指定要序列化的域

 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

 // 指定序列化输入的类型

 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

 jacksonSeial.setObjectMapper(om);

 // 值采用json序列化

 template.setValueSerializer(jacksonSeial);

 // 使用StringRedisSerializer

 template.setKeySerializer(new StringRedisSerializer());

 // 设置hash序列化模式

 template.setHashKeySerializer(new StringRedisSerializer());

 template.setHashValueSerializer(jacksonSeial);

 template.afterPropertiesSet();

 return template;

}

}


4. 实验

修改后重新启动项目,发现比较稳定,后续有问题再反馈吧。

相关文章
|
10月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
753 5
|
10月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
10月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
803 2
|
11月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
7506 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
1001 0
|
11月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
910 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1539 3
|
消息中间件 监控 搜索推荐
Spring全家桶--SpringCloud(中级)(三)
Spring全家桶--SpringCloud(中级)(三)
374 0
Spring全家桶--SpringCloud(中级)(三)