单例模式在生产环境jedis集群中的应用
2023-09-11 14:16:54 时间
背景:不久前单位上线一款应用,上了生产环境之后,没过多久,便吃掉了服务器所有的内存,最后导致网站服务挂了。
在解决了这一问题之后,我发现这其实是典型的一单例模式,现分享一下。
之前存在问题的老代码如下:
这是导致问题所在的那个关键方法
public synchronized static JedisCluster getJedisCluster() { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); // 集群模式 JedisPoolConfig poolConfig = new JedisPoolConfig(); Set<HostAndPort> nodes = new HashSet<HostAndPort>(); HostAndPort hostAndPort1 = new HostAndPort("服务器地址1", 端口1); HostAndPort hostAndPort2 = new HostAndPort("服务器地址2", 端口2); HostAndPort hostAndPort3 = new HostAndPort("服务器地址3", 端口3); nodes.add(hostAndPort1); nodes.add(hostAndPort2); nodes.add(hostAndPort3); JedisCluster jedisCluster = new JedisCluster(nodes, poolConfig); return jedisCluster; }
以上这段代码是有问题的,大家看出来了吗?
问题在于,虽然方法声明为synchronized static,但是在并发多线程的情况下,并不能保证每个用户线程只生成一个JedisCluster的实例。
这样就会导致每个线程都会创建jedisCluster的实例,就会消耗内存,而且这块内存又没有被及时地释放掉,导致多用户并发以后,快速吃光了服务器的内存。
解决方法就是使用单例模式,把JedisCluster作为static的类成员,且使用懒汉单例模式,代码如下:
public class OuterClass{ ... private static JedisCluster jedisCluster = null; ... public synchronized static JedisCluster getJedisCluster() { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); // 集群模式 JedisPoolConfig poolConfig = new JedisPoolConfig(); Set<HostAndPort> nodes = new HashSet<HostAndPort>(); HostAndPort hostAndPort1 = new HostAndPort("服务器地址1", 端口1); HostAndPort hostAndPort2 = new HostAndPort("服务器地址2", 端口2); HostAndPort hostAndPort3 = new HostAndPort("服务器地址3", 端口3); nodes.add(hostAndPort1); nodes.add(hostAndPort2); nodes.add(hostAndPort3); // 只有当jedisCluster为空时才实例化 if (jedisCluster == null) { jedisCluster = new JedisCluster(nodes, poolConfig); } return jedisCluster; } }
这样就会保证即使在高并发的环境下,所有用户线程还是只会拥有一个JedisCluster的实例。
相关文章
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
- 有什么适合记者做笔记,整理采访稿的应用?
- 【KubeMeet 上海站回顾】 探索云原生应用管理与交付新解法
- 重新整理 .net core 实践篇—————应用分层[二十四]
- 【原创】多线程应用中pthread库使用问题
- SAP Fiori应用里Cross Application跳转的一些常见错误
- SAP CRM Fiori 标准应用 My Account - search by ID 根据 ID 进行搜索的标准功能实现原理
- Angular 应用的Support package
- AI:人工智能领域主要方向(技术和应用)、与机器学习/深度学习的关系、数据科学关键技术与知识发现/数据挖掘/统计学/模式识别/神经计算学/数据库的关系(几张图理清之间的暧昧关系)
- 基于未知环境下四旋飞行器运动规划应用研究(Matlab代码实现)
- 随机矩阵理论在电力大数据分析中的应用
- 智能优化算法应用:基于麻雀搜索算法与双伽马校正的图像自适应增强算法 - 附代码
- Kubernetes(k8s)之jenkins实现k8s应用的版本升级和回归,k8s集群部署项目
- Windows平台分布式网站系统应用(转)
- 【K8S】Kubernetes中暴露外部IP地址来访问集群中的应用
- linux 抓包 tcpdump 简单应用
- 【云原生 | Kubernetes 系列】--Ceph集群应用
- 【云原生之kubernetes实战】在k8s集群环境下部署Tomcat应用
- K8S 集群应用配置coredns实现访问内网域名 —— 筑梦之路
- Win11提示内置管理员无法激活此应用解决方法教学
- 你们天天说的应用性能监控: Sky Walking
- RFSoC应用笔记 - RF数据转换器 -06- RFSoC关键配置之RF-ADC内部解析(四)
- 【云原生 | Kubernetes 系列】--Ceph集群应用