SpringBoot整合Redis启动时卡死问题记录

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: SpringBoot整合Redis启动时卡死问题记录

业务: 项目启动时,需要从redis中获取一个业务数据

出现问题: 从redis获取数据时出现卡死现象,项目无法正常启动.


环境配置:

Springboot-data-redis 2.3.5版本

整个项目中依赖较多较为复杂(成熟项目)

排查过程

debug源码

从redisTemplate.get()方法一直debug下去,发现获取数据卡在getConnection的地方,也就是客户端向redis服务端获取连接的时候

过一段时间后出现异常(复现该问题时出现异常输出,第一环境一直在假死状态,并未输出异常)


org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scopedTarget.defaultTraceSampler' defined in class path resource [org/springframework/cloud/sleuth/sampler/SamplerAutoConfiguration$RefreshScopedSamplerConfiguration.class]: Unsatisfied dependency expressed through method 'defaultTraceSampler' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'spring.sleuth.sampler-org.springframework.cloud.sleuth.sampler.SamplerProperties': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)


同时查看线程状态发现线程状态一直在wait状态


猜测卡死现象是因为出现了锁的情况,同时结合百度搜索此类问题,看了一些博客后如: https://blog.csdn.net/x275920/article/details/124078274

但并非我遇到的情况,我们并未使用lettuce连接池,同时服务端也不是集群,只是一个单点

但别人的排查思路也挺有帮助的

解决

最终我尝试将一个一个的涉及到的jar包一个一个去除,再去除到sleuth的时候,奇迹出现了,项目启动没有任何问题,redis也是正常情况.

至此,先定位到问题所在: redis和sleuth出现冲突


再次百度...

https://blog.csdn.net/weixin_44743245/article/details/120813121

这个里面写的就比较全了

总结以下: 其实就是死锁,main线程,lettute线程,上面报错的这个bean scopedTarget.defaultTraceSampler 这三个形成了一个死锁

main拿着singletonObjects的锁,等着lettute来唤醒,luttute获取连接的时候由于sleuth要采样,需要创建scopedTarget.defaultTraceSampler,这个bean创建又依赖于singletonObjects,就这样锁上了.

知道问题之后,解决办法就好搞多了

如上文文章中所说:

  1. 使用spring.sleuth.redis.enabled=false来禁用sleuth的redis采样功能(我采用的,因为链路追踪暂时没用)
  2. 排除TraceRedisAutoConfiguration.class(这个方案类似1),因为配置了enabled=false就自动不注入该bean了
  1. 自定义采样器,来避免死锁,如果以后必要要采样redis,那可能就需要考虑这种方案了 暂记.

总结

排查这个问题的过程中也尝试了改造为lettute连接池的方式,虽然并没有解决问题,也是对redis有了更深入的了解.

搜解决方案也是需要先定位到问题的,不然只搜redis卡死虽然会出来一堆文章,但是其实并不是你遇到的问题,必须要大概能定位到问题的所在,才能更好的结合搜索引擎.比如本次排查过程中,一开始并没有注意到sleuth的问题,一顿搜索其实没啥用,在确定了是因为sleuth的问题后,再针对性的搜索问题就能很快得到答案.

同时也大概了解了一下sleuth的功能.

总结完毕!



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
23天前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
246 0
|
1月前
|
消息中间件 NoSQL Java
springboot redis 实现消息队列
springboot redis 实现消息队列
39 1
|
28天前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
396 0
|
7天前
|
NoSQL 数据可视化 Java
Springboot整合redis
Springboot整合redis
|
7天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
146 10
|
17天前
|
NoSQL Java Redis
Springboot整合redis
Springboot整合redis
|
17天前
|
Java 测试技术 数据库
SpringBoot启动时设置不加载数据库
SpringBoot启动时设置不加载数据库
10 0
|
24天前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
53 1
|
1月前
|
缓存 NoSQL Java
springboot中集成redis,二次封装成工具类
springboot中集成redis,二次封装成工具类
174 0
|
1月前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
46 1

热门文章

最新文章