每次遇到JedisConnectionException这个异常,jedispool就崩溃了,总结问题:有可能是阿里云的服务器老是会掉线,掉线这个问题不止一次遇见了,但也有可能是其它问题;这个问题很严重;为了系统有更好的容灾性,然后就有下面的歪招了;
下面是源码
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.exceptions.JedisConnectionException;
/**
* 工程内不准在其它类调用redis操作,只能在该类.
* 这样的好处是避免了Jedis忘记回收,导致宕机;特别是加了分布式锁的时候,后果是整个集群宕机,当然一般人都没那么笨,锁不加时效,呵....
* @author lyq
*
* @param <T>
*/
public abstract class RedisExecutor<T> {
int errorCount = 0;
protected static final Logger log = Logger.getLogger(RedisExecutor.class);
static Boolean isPass = false;
public JedisPool jedisPool = null;
public Jedis jedis = null;
public Transaction tran = null;
private static LatchControl mylatch = new LatchControl(10000L);
// public RedisExecutor(JedisPool pool){
// this.jedisPool = pool;
// }
public RedisExecutor(){
//整个RedisManager是单例,jedisPool也是单例
this.jedisPool = RedisManager.getInstance().getJedisPool();
}
public T exec() throws PiRedisExecption{
boolean isCatch = false;
try{
//该应用所有线程过来遇到jedispool崩溃了,就是遇到JedisConnectionException,线程就会等待,停到这里。等待某个线程处理完jedispool的异常,再执行。
mylatch.waitLatch();
jedis = jedisPool.getResource();
return run();
}catch(Exception e){
isCatch = true;
if(jedis!=null){
this.jedisPool.returnBrokenResource(jedis);
}
if(tran!=null){
tran.discard();
}
if(e instanceof JedisConnectionException){
errorCount++;
log.info("new jedis pool :"+isPass);
isPass = false;
synchronized (mylatch) {
if(!isPass){
try {
//唤醒锁让所有redis的执行的等待
mylatch.wakeupWait();
RedisManager.getInstance().destoryPool();
isPass = true;
mylatch.countDown();//开锁,所有redis操作继续
log.info("open lock~~~");
} catch (InterruptedException e1) {
throw new RuntimeException(e);
}
}
log.info("execute again!!!!!!!!!!");
}
jedisPool = RedisManager.getInstance().getJedisPool();
// jedis = jedisPool.getResource();
if(errorCount<5){
return exec();//在新的jedispool下再跑一遍
}else{
throw new PiRedisExecption(e);
}
}
return null;
// throw new PiRedisExecption(e);
}finally{
if(jedis!=null&&(!isCatch)){
this.jedisPool.returnResource(jedis);
}
}
}
public abstract T run() throws Exception;
}
下面这个类是CountDownLatch的扩展,在执行过程中CountDownLatch.await()是主动执行等待,那么这个类的waitLatch是被动执行等待;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* LatchControl是CountDownLatch的被动式
* @author lyq
*
*/
public class LatchControl {
Long timeout = 1L;
public LatchControl(Long timeout){
this.timeout = timeout;
}
public CountDownLatch latch = null;
public void waitLatch() throws InterruptedException{
if(latch!=null){
latch.await(this.timeout*2,TimeUnit.MILLISECONDS);
}
}
public void wakeupWait() throws InterruptedException{
latch = new CountDownLatch(1);
Thread.sleep(this.timeout);
}
public void countDown(){
latch.countDown();
latch = null;
}
}
然后关于jedis的调用,绝对不会忘掉回收jedis;或者遇到JedisConnectionException挂掉整个应用;
new RedisExecutor<Boolean>() {
@Override
public Boolean run() throws Exception {
//tran = jedis.multi();需要使用redis事务时
if(jedis.zcard(keyName)==0){
jedis.del(keyName);
return true;
}
// tran.exec();
return false;
}
}.exec();
分享到:
相关推荐
在配置JedisPool时,了解其参数的意义至关重要,以确保正确地调整和优化连接池的行为。以下是对JedisPool配置参数的详细解释: 1. **maxActive**: 这个参数定义了连接池中允许的最大活动连接数。如果设置为-1,表示...
然而,在高并发的情况下,jedispool可能会出现卡死的问题,本文将会详细介绍jedispool连redis高并发卡死的问题,以及如何解决这些问题。 一、jedispool的工作原理 jedispool是基于apache common pool实现的连接池...
标题中的"jedis-2.9.0+commons-pool2-2.4.2redis依赖包"指的是一款基于Java实现的Redis客户端库Jedis的2.9.0版本,与Apache Commons Pool 2.4.2版本相结合的依赖包。这个组合主要用于优化Redis连接池管理,提高应用...
在IT行业中,高并发解决方案是针对大量用户同时访问或操作同一系统、应用或服务时,保证系统稳定、高效运行的技术策略。高并发场景通常出现在互联网服务、电子商务、社交媒体、在线游戏以及大数据处理等领域。以下是...
Impala 并发查询缓慢问题解决方案 Impala 是一个基于Apache Hadoop的高性能、实时查询引擎,但是在并发查询时,可能会出现缓慢问题。本文将提供三种改造方案来解决Impala并发查询缓慢问题,并对每种方案进行测试...
《大并发架构统一解决方案》 在当今互联网时代,高并发已成为各类网站和应用程序的基本需求,尤其是在电商、社交、媒体等领域,处理大量用户同时在线交互的能力是衡量系统性能的关键指标。本解决方案围绕“大并发...
在构建大型高并发的网站时,开发者面临的主要挑战是如何处理大量用户同时访问并请求服务的情况。高并发场景下的网站设计需要考虑系统性能、稳定性、可扩展性和资源优化等多个方面。以下是一些关键的知识点和解决方案...
常见的提高高并发下访问的效率的手段,了解高并发的的瓶颈在哪里,具体的高并发解决方案
本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...
解决这个问题的一种常见策略是使用Jedis的连接池JedisPool,它提供了更高效和可控的资源管理机制。 JedisPool的工作原理是维护一个Jedis实例的池,当需要与Redis交互时,可以从池中借用一个实例,使用完毕后归还给...
高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11、双12,就会产生高并发。又如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击。服务端:导致站点服务器/DB服务器资源被占满崩溃,数据的...
在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High Concurrency)以及多线程(Multithreading)。这些概念是现代软件开发中不可或缺的一部分,尤其是在...
然而,在高并发环境下,频繁创建和销毁Jedis实例会带来较大的开销。为了解决这个问题,`Apache Commons Pool 2`被引入作为对象池管理工具。`Commons Pool 2`是一个通用的对象池服务,允许开发者创建自己的对象池,以...
业务拆分&物理隔离(解决各业务线相互影响)、数据隔离(分库分表)、使用本地缓存&缓存压缩提高系统吞吐量(核心接口平均响应时间降低98.6%,redis并发|流量|存储空间降低64%|37%|35%)。优化后单机压测qps理论值由2300...
标题中的“jedis”和“common-pool”指的是在Java开发中常用的两个库,它们分别是Jedis和Apache Commons Pool。Jedis是专为处理Redis数据存储服务而设计的一个Java客户端,而Apache Commons Pool则是一个通用的对象...
### JavaWeb并发编程与高并发解决方案 #### 一、并发编程概述 在现代软件开发中,尤其是对于基于JavaWeb的应用程序来说,面对大量的用户请求和数据处理任务时,高效的并发处理能力至关重要。并发编程旨在利用多...
在Java环境中与Redis进行交互时,我们通常会使用客户端库,Jedis是其中非常流行的一个选择。本篇文章将详细阐述`redis-pool-jedis`所需的基础jar包以及它们在与Redis交互中的作用。 首先,`jedis-2.6.2.jar`是Jedis...
在探讨Java并发编程与高并发解决方案的过程中,我们会涉及到一系列核心概念和相关技术。本文将基于文档《Java并发编程与高并发解决方案-学习笔记***.pdf》中提供的内容,来详细阐述并发编程和高并发的基本概念、CPU...
【JedisPool资源池优化方法】 在分布式缓存系统中,Redis是一个常用的数据存储和高速访问的工具。而Jedis是Java开发的Redis客户端,它使用Apache Commons Pool2库来管理资源池,即JedisPool,以实现高效的连接复用...
Java并发编程与高并发解决方案是开发高性能应用的关键技术。在基础篇中,主要涉及以下几个重要知识点: 1. **并发编程基础** - **并发**:并发是指在一个时间段内,多个线程交替执行,使得系统看起来像是同时处理...