Spring Boot/Spring Cloud中Redis报错Connection reset

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本文目录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. 实验

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
104 5
|
1月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
36 6
|
1月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
58 5
|
1月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
42 5
|
2月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
69 2
|
3月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
173 2
|
2月前
|
NoSQL Java Redis
springCloud中将redis共用到common模块
通过将Redis配置和操作服务提取到Common模块,可以在Spring Cloud微服务架构中实现高效的代码复用和统一管理。这种设计不仅简化了各个服务的配置和依赖管理,还提高了代码的可维护性和可读性。希望本文对你在Spring Cloud项目中集成和使用Redis有所帮助。
81 0
|
2月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
53 0
|
16天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
158 85
|
3月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
85 6