jedispool连redis高并发卡死的问题
java端在使用jedispool连接redis的时候,在高并发的时候经常死锁,或报连接异常,JedisConnectionException,或者getResource异常等各种问题
在使用jedispool的时候一定要注意两点
1。在获取jedisPool和jedis的时候加上线程同步,保证不要创建过多的jedispool和jedis
2。用完Jedis实例后需要返还给JedisPool
整理了一下redis工具类,通过大量测试和高并发测试的
packagecom.caspar.util; importjava.util.concurrent.locks.ReentrantLock; importorg.apache.log4j.Logger; importredis.clients.jedis.Jedis; importredis.clients.jedis.JedisPool; importredis.clients.jedis.JedisPoolConfig; /** *Redis工具类 *@authorcaspar * */ publicclassRedisUtil{ protectedstaticReentrantLocklockPool=newReentrantLock(); protectedstaticReentrantLocklockJedis=newReentrantLock(); protectedstaticLoggerlogger=Logger.getLogger(RedisUtil.class); //Redis服务器IP privatestaticStringADDR_ARRAY=FileUtil.getPropertyValue("/properties/redis.properties","server"); //Redis的端口号 privatestaticintPORT=FileUtil.getPropertyValueInt("/properties/redis.properties","port"); //访问密码 //privatestaticStringAUTH=FileUtil.getPropertyValue("/properties/redis.properties","auth"); //可用连接实例的最大数目,默认值为8; //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 privatestaticintMAX_ACTIVE=FileUtil.getPropertyValueInt("/properties/redis.properties","max_active");; //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。 privatestaticintMAX_IDLE=FileUtil.getPropertyValueInt("/properties/redis.properties","max_idle");; //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException; privatestaticintMAX_WAIT=FileUtil.getPropertyValueInt("/properties/redis.properties","max_wait");; //超时时间 privatestaticintTIMEOUT=FileUtil.getPropertyValueInt("/properties/redis.properties","timeout");; //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; privatestaticbooleanTEST_ON_BORROW=FileUtil.getPropertyValueBoolean("/properties/redis.properties","test_on_borrow");; privatestaticJedisPooljedisPool=null; /** *redis过期时间,以秒为单位 */ publicfinalstaticintEXRP_HOUR=60*60;//一小时 publicfinalstaticintEXRP_DAY=60*60*24;//一天 publicfinalstaticintEXRP_MONTH=60*60*24*30;//一个月 /** *初始化Redis连接池 */ privatestaticvoidinitialPool(){ try{ JedisPoolConfigconfig=newJedisPoolConfig(); config.setMaxTotal(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool=newJedisPool(config,ADDR_ARRAY.split(",")[0],PORT,TIMEOUT); }catch(Exceptione){ logger.error("FirstcreateJedisPoolerror:"+e); try{ //如果第一个IP异常,则访问第二个IP JedisPoolConfigconfig=newJedisPoolConfig(); config.setMaxTotal(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool=newJedisPool(config,ADDR_ARRAY.split(",")[1],PORT,TIMEOUT); }catch(Exceptione2){ logger.error("SecondcreateJedisPoolerror:"+e2); } } } /** *在多线程环境同步初始化 */ privatestaticvoidpoolInit(){ //断言,当前锁是否已经锁住,如果锁住了,就啥也不干,没锁的话就执行下面步骤 assert!lockPool.isHeldByCurrentThread(); lockPool.lock(); try{ if(jedisPool==null){ initialPool(); } }catch(Exceptione){ e.printStackTrace(); }finally{ lockPool.unlock(); } } publicstaticJedisgetJedis(){ //断言,当前锁是否已经锁住,如果锁住了,就啥也不干,没锁的话就执行下面步骤 assert!lockJedis.isHeldByCurrentThread(); lockJedis.lock(); if(jedisPool==null){ poolInit(); } Jedisjedis=null; try{ if(jedisPool!=null){ jedis=jedisPool.getResource(); } }catch(Exceptione){ logger.error("Getjediserror:"+e); }finally{ returnResource(jedis); lockJedis.unlock(); } returnjedis; } /** *释放jedis资源 *@paramjedis */ publicstaticvoidreturnResource(finalJedisjedis){ if(jedis!=null&&jedisPool!=null){ jedisPool.returnResource(jedis); } } /** *设置String *@paramkey *@paramvalue */ publicsynchronizedstaticvoidsetString(Stringkey,Stringvalue){ try{ value=StringUtil.isEmpty(value)?"":value; getJedis().set(key,value); }catch(Exceptione){ logger.error("Setkeyerror:"+e); } } /** *设置过期时间 *@paramkey *@paramseconds以秒为单位 *@paramvalue */ publicsynchronizedstaticvoidsetString(Stringkey,intseconds,Stringvalue){ try{ value=StringUtil.isEmpty(value)?"":value; getJedis().setex(key,seconds,value); }catch(Exceptione){ logger.error("Setkeyexerror:"+e); } } /** *获取String值 *@paramkey *@returnvalue */ publicsynchronizedstaticStringgetString(Stringkey){ if(getJedis()==null||!getJedis().exists(key)){ returnnull; } returngetJedis().get(key); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。