java原生程序redis连接(连接池/长连接和短连接)选择问题
最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下。
这个问题的具体发生在java原生程序和redis的交互中。这个问题对我最深刻的教训就是说明获取连接不能迷信连接池和原封不动的搬运以前代码的utils。在连接的建立的一开始就应该思考连接的稳定性和是否应该关闭连接。否则这些问题在线上运行十几个小时可能才会暴露,即使知道了问题反过来的排查和修改也会很困难。甚至在重构之前用一种勉强凑合的方式掩盖问题(给自己挖坑)
应用场景
java原生程序,内部写多个线程,定时循环监测(一小时一次),使用了redis连接。
最开始是采用长连接的方式,在main方法中用连接池获取连接后分配到各线程,这种方式虽然只创建一次连接,但在长时间的程序休眠中,仍然会产生对连接的占用,也会导致掉连接的问题,以下是从连接池获取连接的代码(也可拆分成获取连接池和通过连接池单独获取连接):
public Jedis createJedisCluterInstance(Map<String, Object> 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<Boolean> retryer = RetryerBuilder.<Boolean>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<String, Object> 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;
}
来源:https://blog.csdn.net/jyj1100/article/details/86499547
java原生程序redis连接(连接池/长连接和短连接)选择问题的更多相关文章
- [转载] http长连接和短连接
转载自http://blog.csdn.net/shine0181/article/details/7799754/ HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP ...
- mysql长连接与短连接
什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接-> ...
- TCP/IP,http,socket,长连接,短连接——小结。
来源:http://blog.chinaunix.net/uid-9622484-id-3392992.html TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. ...
- http的长连接和短连接(数据库也一样)
长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 短连接是指通信双方有数据交互时 ...
- TCP/IP,http,socket,长连接,短连接——小结(转)
概要: 之前对这几个概念有点糊涂,查阅了些资料,稍微概括下他们的区别吧.如有错误,请拍~~~ 先看图: TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在 ...
- [转]TCP(HTTP)长连接和短连接区别和怎样维护长连接
原文链接 一.HTTP协议和TCP协议 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题, ...
- TCP/IP,http,socket,长连接,短连接 —— 小结
TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议 ...
- Socket 长连接与短连接,心跳
长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 短连接是指通信双方有数据交互时 ...
- 长连接、短连接、长轮询和WebSocket
//转发,格式待整理 2017-08-0519784View0 对这四个概念不太清楚,今天专门搜索了解一下,总结一下: 长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务 ...
随机推荐
- PL/SQL语言基础
PL/SQL语言基础 进行PL/SQL编程前,要打开输出set serveroutput on 1.创建一个匿名PL/SQL块,将下列字符输出到屏幕:"My PL/SQL Block Wor ...
- DataPicker 日期选择器
问题描述:DataPicker 日期选择器,如何选取时间段(本日,昨日,上周,上月,当月) 代码实现: <el-date-picker v-model="searchForm.data ...
- win10安装JDK cmd中可以运行java,但不能用javac,解决方案
win10安装JDK cmd中可以运行java,但不能用javac 网上教程(1)新建->变量名"JAVA_HOME",变量值"C:\Java\jdk1.8.0_0 ...
- 使用开源文档工具docsify,用写博客的姿势写文档
前提 下面的简介摘抄自docsify的官网 https://docsify.js.org 中的简介 docsify是一个神奇的文档网站生成器.他可以快速帮你生成文档网站.不同于GitBook.Hexo ...
- 《神经网络的梯度推导与代码验证》之CNN的前向传播和反向梯度推导
在FNN(DNN)的前向传播,反向梯度推导以及代码验证中,我们不仅总结了FNN(DNN)这种神经网络结构的前向传播和反向梯度求导公式,还通过tensorflow的自动求微分工具验证了其准确性.在本篇章 ...
- C# 自定义无边框窗体阴影效果
工作中我们会经常遇到自定义一些窗口的样式,设置无边框然后自定义关闭.最大化等其他菜单,但是这样就失去了Winform自带的边框阴影效果,下面这个方法能让无边框增加阴影效果.代码如下: using Sy ...
- 面试:为了进阿里,又把并发CAS(Compare and Swap)实现重新精读一遍
该系列文章已收录在公众号[Ccww技术博客],原创技术文章第一时间推出 前言 在面试中,并发线程安全提问必然是不会缺少的,那基础的CAS原理也必须了解,这样在面试中才能加分,那来看看面试可能会问那些问 ...
- Vue事件绑定原理
Vue事件绑定原理 Vue中通过v-on或其语法糖@指令来给元素绑定事件并且提供了事件修饰符,基本流程是进行模板编译生成AST,生成render函数后并执行得到VNode,VNode生成真实DOM节点 ...
- 剑指 Offer 55 - I. 二叉树的深度
题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15 ...
- 跟着尚硅谷系统学习Docker-【day06】
day06-20200720 p24.dockerfile案例编写-1 1.创建好容器时,进去容器的时候,修改所在的当前目录. 2.新添加命令.支持vim.ifconfig 备注:原来的镜像容器默 ...