每次遇到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();
分享到:
相关推荐
高并发解决方案
大型高并发的网站解决方案
常见的提高高并发下访问的效率的手段,了解高并发的的瓶颈在哪里,具体的高并发解决方案
本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...
互联网高并发解决方案互联网高并发解决方案互联网高并发解决方案
本篇文章主要介绍了jedispool连redis高并发卡死的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11、双12,就会产生高并发。又如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击。服务端:导致站点服务器/DB服务器资源被占满崩溃,数据的...
业务拆分&物理隔离(解决各业务线相互影响)、数据隔离(分库分表)、使用本地缓存&缓存压缩提高系统吞吐量(核心接口平均响应时间降低98.6%,redis并发|流量|存储空间降低64%|37%|35%)。优化后单机压测qps理论值由2300...
Impala并发查询缓慢问题解决方案.docx
java 如何处理高并发编程的解决方案 视频资料齐全
JavaWeb并发编程与高并发解决方案.docx
Java并发编程与高并发解决方案-学习笔记
高并发网站解决方案.doc
Java并发编程与高并发解决方案笔记-基础篇.docx
IIS网站高性能高并发优化解决方案,通过修改IIS配置结合window定时任务优化IIS下网站的高并发访问性能
大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高 性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。这几个解决思路在一定程度上意味...
高并发-高负载数据库解决方案(也有针对SQL).pdf高并发-高负载数据库解决方案(也有针对SQL).pdf高并发-高负载数据库解决方案(也有针对SQL).pdf高并发-高负载数据库解决方案(也有针对SQL).pdf高并发-高负载数据库解决...
Java并发编程与高并发解决方案-学习笔记-www.itmuch.com
Java并发编程与高并发解决方案(高清视频教程).rar
1,企业高并发的成熟解决方案资料和笔记;2,数据库高并发原理+演示+说明资料和笔记 其中,第一部分内容有:高并发解决方案;Oracle及Mysql库表拆分;企业高并发的成熟解决方案(一)笔记;企业整个架构图。第二部分...