原标题:java原生程序redis连接(连接池/长连接和短连接)选择问题

最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下。

这个问题的具体发生在java原生程序和redis的交互中。这个问题对我最深刻的教训就是说明获取连接不能迷信连接池和原封不动的搬运以前代码的utils。在连接的建立的一开始就应该思考连接的稳定性和是否应该关闭连接。否则这些问题在线上运行十几个小时可能才会暴露,即使知道了问题反过来的排查和修改也会很困难。甚至在重构之前用一种勉强凑合的方式掩盖问题(给自己挖坑)

应用场景

java原生程序,内部写多个线程,定时循环监测(一小时一次),使用了redis连接。

最开始是采用长连接的方式,在main方法中用连接池获取连接后分配到各线程,这种方式虽然只创建一次连接,但在长时间的程序休眠中,仍然会产生对连接的占用,也会导致掉连接的问题,以下是从连接池获取连接的代码(也可拆分成获取连接池和通过连接池单独获取连接):

public Jedis createJedisCluterInstance(Map props){

String[] hostPortStr = String.valueOf(this.config.getOrDefault(REDIS_CLUSTER_NODE_PORT,props.get(REDIS_CLUSTER_NODE_PORT))).split(":");

GenericObjectPoolConfig config = new GenericObjectPoolConfig();

config.setMaxTotal(Integer.valueOf(String.valueOf(this.config.getOrDefault(REDIS_MAX_TOTAL,props.get(REDIS_MAX_TOTAL)))));

config.setMaxIdle(Integer.valueOf(String.valueOf(this.config.getOrDefault(REDIS_MAX_IDLE,props.get(REDIS_MAX_IDLE)))));

config.setMaxWaitMillis(Integer.valueOf(String.valueOf(this.config.getOrDefault(REDIS_MAX_WAIT_MILLIS,props.get(REDIS_MAX_WAIT_MILLIS)))));

JedisPool jedisPool = new JedisPool(config,hostPortStr[0],Integer.valueOf(hostPortStr[1]));

final Jedis[] jedis= {null};

Retryer retryer = RetryerBuilder.newBuilder()

.retryIfException()

.withWaitStrategy(WaitStrategies.fixedWait(1000, TimeUnit.MILLISECONDS))

.withStopStrategy(StopStrategies.stopAfterAttempt(10))

.build();

try {

retryer.call(() -> {

jedis[0] = jedisPool.getResource();

jedis[0].auth("123");

String value = jedis[0].ping();

return StringUtils.isNotBlank(value);

});

} catch (Exception e) {

LOGGER.error("多次获取Redis连接失败!");

}

return jedis[0];

}

当时处理掉连接的方式是采用了定时任务按每分钟一次的频率监测,对异常trycatch后直接退出程序。

这种方法产生了很大的资源消耗,也对业务造成影响,主要原因是盲目使用连接池造成的。

修改后采用传入配置到线程中,在线程中启动连接,同时修改连接池连接为直接获取连接。减少了资源消耗,同时也处理了掉连接的问题。并在每次循环结束后关闭redis连接 :关闭方法redis.close(); 并在下次循环开始后重新初始化,直接获取redis对象代码:

public Jedis getJedis(Map props){

String[] hostPortStr = String.valueOf(this.config.getOrDefault(REDIS_CLUSTER_NODE_PORT, props.get(REDIS_CLUSTER_NODE_PORT))).split(":");

Jedis jedis = new Jedis(hostPortStr[0],Integer.valueOf(hostPortStr[1]),Integer.valueOf(String.valueOf(this.config.getOrDefault(REDIS_MAX_WAIT_MILLIS, props.get(REDIS_MAX_WAIT_MILLIS)))));

jedis.auth("123");

return jedis;

}

---------------------

作者:jyj019

原文:https://blog.csdn.net/jyj1100/article/details/86499547

版权声明:本文为博主原创文章,转载请附上博文链接!返回搜狐,查看更多

责任编辑:

java长连接转短连接_java原生程序redis连接(连接池/长连接和短连接)选择问题...相关推荐

  1. java判断时间区间 隔天_Java初中级程序员面试题宝典

    Java基础部分 &与&&区别? &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假:但是&&当第一个条件不成之后,后面的条件都 ...

  2. java定时发送短信_java实现指定时间触发一个事件(比如定时发送短信) | 学步园...

    package com.huawei.dm.datasource.system; import java.util.Calendar; import java.util.Date; import ja ...

  3. java开发一年多少钱_JAVA开发程序员一个月到底能拿多少钱?年薪百万是真是假?...

    近年来,在网上只要是薪资排行榜,必然会出现IT行业,IT互联网行业常年在薪资排行榜上高居前三,因此都说程序员是个高薪行业,是个多金行业.既然如此,让我们来看看2020年JAVA开发程序员的薪资水平到底 ...

  4. java比较三个数的编程_Java小程序输入三个数求最大数

    Java小程序输入三个数求最大数代码: import java.io.*; public class Help { // 比较两个数字 public static void main(String[] ...

  5. java 在一个类中定义类_Java 中程序代码必须在一个类中定义,类使用( )关键字来定义。_学小易找答案...

    [填空题]每一个 else 子句都必须和它前面的一个距离它最近的 子句相对应. [单选题]有关类的说法,正确的是( ) [单选题]在JAVA中,无论测试条件是什么,下列( )循环体 将至少执行一次. ...

  6. java向kafka推送数据_Java编写程序将数据存入Kafka中

    Kafka是一个类似于RabbitMQ的消息系统,它的主要功能是消息的发布和订阅.处理和存储. 1.它类似于一个消息系统,读写流式的数据. 2.编写可扩展的流应用处理程序,用于实时事件响应的场景. 3 ...

  7. java默认权限什么时候使用_Java 应用程序默认权限(简例)

    应用程序与Applet不同,没有自动安装的安全管理器.默认情况下,应用程序具备完全的权限.这里创建一个应用程序获得系统属性值 /* * @(#)GetSysprop.java 1.0 06/08/07 ...

  8. java中1%4是多少_java语言程序设计基础篇课后编程练习答案2~4章

    import javax.swing.JOptionPane; //2.4 /*public class LQ { public static void main(String []args) { S ...

  9. SQL数据库隐藏服务器后需要在连接字符串增加端口号,(provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)]...

    1.将SQL数据库服务设置为隐藏,端口默认改为2433 2.原有的ASP.NET程序访问数据库报错: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器. ...

最新文章

  1. 采访与书评 —— 《BDD In Action》
  2. CCF 2017年题目题解 - Python
  3. redis代码 发布订阅
  4. 海南师范大学计算机设计大赛证书,我校品牌VI设计作品在中国大学生计算机设计大赛海南省赛中获得一等奖...
  5. 题解【bzoj4653 [NOI2016] 区间】
  6. AVS 帧内预测模式的汇编优化
  7. java 遍历hashmap key_Java5种遍历HashMap数据的写法
  8. HDU1505(HDU1506的加强版)
  9. vue为app做h5页面,如何做到同域名对应不同版本的h5代码
  10. Qt之音频播放升级(七)
  11. 初学JAVA,开发环境的搭建(JDK和Eclipse的安装)
  12. 混合开启服务-----百度音乐盒
  13. 天勤数据结构——绪论
  14. CC8编译报错:error #10099-D 解决方案(已解决)
  15. vue swiper click失效
  16. Windows与Linux之间的文件互传
  17. 【设计模式】描述先有鸡还是先有蛋
  18. PO 审批 PO Release
  19. 《高级无线网络—4G技术》——第1章  基础 1.1 4G网络及复合无线环境
  20. MATLAB实现一元三次方程求解/盛金公式

热门文章

  1. 错误记录--更改tomcat端口号方法,Several ports (8005, 8080, 8009)
  2. Android View生命周期
  3. 软件测试个人心得总结
  4. 从底层重学 Java 之四大整数 GitChat链接
  5. php 调用微信收货地址,php版微信自动获取收货地址api用法示例
  6. android广播第三方库,Android Support 库:LocalBroadcastManager
  7. 【微信网页直接下载app】微信跳转-微信浏览器中直接唤起本地浏览器和App
  8. 模板——树状数组求逆序对
  9. jquery ajax 数据传输
  10. 十年WEB技术发展历程