博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式在生产环境jedis集群中的应用
阅读量:6680 次
发布时间:2019-06-25

本文共 2204 字,大约阅读时间需要 7 分钟。

背景:不久前单位上线一款应用,上了生产环境之后,没过多久,便吃掉了服务器所有的内存,最后导致网站服务挂了。

 

在解决了这一问题之后,我发现这其实是典型的一单例模式,现分享一下。

之前存在问题的老代码如下:

这是导致问题所在的那个关键方法

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
nodes = new HashSet
(); 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
nodes = new HashSet
(); 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的实例。

 

转载于:https://www.cnblogs.com/davidgu/p/6277924.html

你可能感兴趣的文章
麒麟开源堡垒机功能版本说明及升级方式说明
查看>>
Parquet性能测试调优及其优化建议
查看>>
交换机SPAN功能配置
查看>>
关于ssh的问题
查看>>
作业 rh124
查看>>
Docker创建tomcat镜像
查看>>
Restful学习随笔
查看>>
2018区块链学习路线及大纲附Java,Python,初级高级,深入浅出视频教程
查看>>
迭代器,生成器,可迭代
查看>>
[Algorithms] Longest Common Subsequence
查看>>
常见排序算法总结(含C/C++代码)
查看>>
CurrentRowColor 选中行 颜色改变
查看>>
内容溢出显示省略号
查看>>
二维码(支持arc,苹果自带扫描,zbar扫描,二维码生成)
查看>>
更改matlab默认工作路径
查看>>
[转] EM算法
查看>>
在VS中折叠所有代码或展开所有代码
查看>>
JavaScript 书籍推荐(转)
查看>>
《活法》摘录一
查看>>
C/S和B/S结构区别整理
查看>>