先上效果,连接数从10000下降到25,提升400倍;

内存占用,从70%下降到18%,降幅1/4;

一、现象

服务用了redis,主要为加锁用,保证唯一性;最初服务正常,后期只要用到redis的地方,不超2分钟,10000的连接数就会被打满,最后造成资源耗尽、服务崩溃。

二、分析

阿里云redis最大连接数是10000个,被打满只有2个可能,连接数创建后,要么没释放(销毁),要么在持续不断的创建,且创建数无大于释放数。

怀疑1:连接没被释放

查代码,所有加锁的地方,最终都在finally中作unlock,所以此条被排除、

try{
**业务代码**} catch (Exception e) {
} finally {if (rLock.isLocked()) {if (rLock.isHeldByCurrentThread()) {rLock.unlock();}}
}

怀疑2:连接在不断的创建,且大于销毁数

因为最初的redis是用默认配置,代码如下:

public class RedissonConfig {public static RedissonClient redissonClient() {Config config = new Config();String url = xx.getConfig("rds.url");String pwd = xx.getConfig("rds.pwd");Integer database = Integer.parseInt(xx.getConfig("rds.database"));config.useSingleServer().      .setAddress(url).setPassword(pwd).setDatabase(database);RedissonClient redisson = Redisson.create(config);return redisson;}
}

以为是相关参数没配置,于是把参数加上,然并卵

 config.useSingleServer().setConnectTimeout(10000).setTimeout(3000).setIdleConnectionTimeout(10000).setConnectionPoolSize(16).setConnectionMinimumIdleSize(6).setRetryAttempts(3).setRetryInterval(1500).setAddress(url).setPassword(pwd).setDatabase(database);

后来查到这位博友:单例模式之「双重校验锁」_HoryC的博客-CSDN博客_单例模式双重校验锁

的文章,忽然顿悟,可能是JFinal在实现时,没有默认像SpringBoot一样将redis转为单例,造成不断创建线程连接,从源码可以看出,连接池默认是64,在旧锁未释放前,不断创建,造成打爆

三、解决

知道原因就好办了,在创建前先作判断,如果存在则直接return,否则创建

public class RedissonConfig {//必须有volatile修饰(防止指令重排序)private volatile static RedissonClient instance;//构造函数必须私有(防止外部通过构造方法创建对象)private RedissonConfig() {}public static RedissonClient redissonClient() {//第一个判空(如果是空,就不必再进入同步代码块了,提升效率)if (instance == null) {//这里加锁,是为了防止多线程的情况下出现实例化多个对象的情况synchronized (RedissonConfig.class) {//第二个判空(如果是空,就实例化对象)if (instance == null) {Config config = new Config();config.setCodec(new org.redisson.client.codec.StringCodec());config.useSingleServer().setConnectionPoolSize(50);//设置对于master节点的连接池中连接数最大为500config.useSingleServer().setIdleConnectionTimeout(100000);//如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。config.useSingleServer().setConnectTimeout(300000);//同任何节点建立连接时的等待超时。时间单位是毫秒。config.useSingleServer().setTimeout(30000);//等待节点回复命令的时间。该时间从命令发送成功时开始计时。//  不能反序列化 阻塞队列中的string元素Codec codec = new JsonJacksonCodec();config.setCodec(codec);// 你的IPconfig.useSingleServer().setAddress(url).setPassword(pwd).setDatabase(database).setKeepAlive(true);instance = Redisson.create(config);}}}return instance;}
}

redis 连接打满的解决相关推荐

  1. 总结一下利用Jedis连接redis连接不上的解决办法

    1.先查看防火墙状态 firewall-cmd --state 2.停止防火墙 systemctl stop firewalld.service 3.禁止firewall开机启动 systemctl ...

  2. redis 命令 释放连接_redis scan命令导致redis连接耗尽,线程上锁的解决

    使用redis scan方法无法获取connection,导致线程锁死. 0.关键字 redis springboot redistemplate scan try-with-resource 1.异 ...

  3. a频繁连接不上redis_解决Redis连接无法正常释放的问题

    错误信息: IllegalStateException: Invalidated object not currently part of this pool 一.问题描述 前些天用多线程执行操作测试 ...

  4. 记一次线上环境 redis偶尔连接超时报错 解决

    记一次线上环境 redis偶尔连接超时报错 解决 贴出本地控制台日志 说实话,很痛苦,跟进很久了,一直认为的jvm程序所使用的配置的连接池框架问题 因为程序为 springboot 2 spring ...

  5. redis连接不上,两种解决方式

    今天某个项目的redis连不上了,将自己用到的两个解决办法写篇记录(实际使用时方法二选一即可). redis连接不上,两种解决方式 一.首先排查本地redis连接有没有问题 1. 在服务器上查看red ...

  6. 解决Redis 连接池报错:ERR max number of clients reached

    前言 redis maxclients 是redis server的重要配置,它决定了客户端的最大连接数量,最大客户端连接数量.由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接 ...

  7. php predis连接超时,如何解决redis连接超时问题

    问题描述: redis连接超时,然后定位到redis配置文件目录被删除,接着尝试重启redis,发现连接中断,未启动成功. 报错: 查看redis的输出日志.出现下图所示的报错: 根据提示在/etc/ ...

  8. redis连接失败的两个解决办法

    redis连接大多数失败主要有两个原因 修改下redis的配置文件,redis.conf,把 bind 127.0.0.1 注释掉,protected-mode yes 把yes改为no 这些东西配置 ...

  9. Redis连接出现Error: Connection reset by peer的问题是由于使用Redis的安全模式

    现在网上一查出现安全模式的连接,基本都是要关闭服务端的操作,其实这种方式是不正确的,最有效的解决方式是使用stunnel进行安全模式的连接. 我碰到的问题是微软云(其实我不想用!)连接Redis,默认 ...

最新文章

  1. PCE:南农沈其荣团队根系分泌物驱动土壤-微生物-养分之间的反馈作用以响应植物的生长...
  2. 高通平台modem部分mbn文件的OTA和PDC升级方法
  3. 仿生计算(参考神经网络)2017年考试卷子,考前抱佛脚必备!!中英翻译版本!!
  4. 首次摆脱对梯度的依赖,CMU等开源Score-CAM:基于置信分数的视觉可解释性
  5. php项目通过不了压力测试,压力测试 – Apache ab测试和失败 – Apache或PHP配置问题?...
  6. C#中的序列化和反序列化案例
  7. CentOS虚拟机时间同步
  8. 苹果cms v10 仿电影淘淘PC+WAP模板
  9. python logger_牛逼!python中的logging模块居然这么好用!
  10. 无插件,跨平台,基于WebGL的三维地球来了!!!
  11. asp.net 页面数据导入word模板
  12. html 条款前面的选项,HTML内部测试笔试题.doc
  13. 矩阵变量的矩阵值函数微分公式 (原创)
  14. LAMP架构部署论坛
  15. Linux公网渗透抓鸡实验
  16. orcal添加序列让主键的自动增长
  17. Delphi中BeginUpdate和EndUpdate作用
  18. java写满天繁星,描写满天繁星唯美句子
  19. 在html中frame标签的作用,HTML中的frame标签常见的6大属性,新手一定要悉知!
  20. kubernetes入门实战

热门文章

  1. 【.NET】C#中遍历各类数据集合的方法
  2. Go语言写一个键盘映射的程序
  3. 战斗系统平衡性评估(算法题)
  4. 【技巧】Python 视频转音频
  5. CocosCreator | 绕任意轴旋转/绕任意点旋转/平滑旋转/自定义环形体、胶囊体/面向目标位置
  6. shell变量计算长度及加减运算方法总结
  7. 全球最赚钱的十款游戏,你玩过吗?
  8. 英雄联盟LPL春季赛开赛 斗鱼全程蓝光直播
  9. 美丽的项链(素数环)(回溯法)
  10. 对每一个匹配的部分替换不同的字符(主要分享思想)