国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

在Java中使用Jedis操作Redis,在高并發(fā)的情況下,應(yīng)用卡死、報(bào)無法獲取連接錯(cuò)誤的處理方式

2019-11-06 07:47:12
字體:
供稿:網(wǎng)友
1.JedisUtil:工具類,單例,避免獲取多個(gè)jedisPool 對象package JedisTest;import org.apache.commons.lang.StringUtils;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** * Jedis工具類 * @author lanchunqiu * */public class JedisUtil {    PRivate static int PORT = 6379;    /**     * 可用連接實(shí)例的最大數(shù)目,如果不設(shè)默認(rèn)為8,;如果賦值為-1表示不限制;如果pool已經(jīng)分配了MAX_ACTIVE個(gè)jedis實(shí)例,則此時(shí)pool的狀態(tài)為exhausted(耗盡)     */    private static int MAX_ACTIVE = 500;        /**     * 控制一個(gè)pool最多有多少個(gè)狀態(tài)為idle(空閑)的jedis實(shí)例,不設(shè)默認(rèn)值為8     */    private static int MAX_IDLE = 10;        /**     * 控制一個(gè)pool最少有多少個(gè)狀態(tài)為空閑的jedis實(shí)例     */    private static int MIN_IDLE = 100;        /**     * 在borrow一個(gè)jedis實(shí)例時(shí),是否提前進(jìn)行validate(驗(yàn)證)操作,如果為true,則得到的jedis實(shí)例都是可用的     */    private static boolean TEST_ON_BOOROW = true;        /**     * 在將連接放回池中前,自動(dòng)檢驗(yàn)連接是否有效       */    private static boolean TEST_ON_RETURN = true;        /**     * 自動(dòng)測試池中的空閑連接是否都是可用連接       */    private static boolean TEST_WHILE_IDLE = true;    /**     * 等待一個(gè)可用連接的最大時(shí)間,單位毫秒,默認(rèn)值為-1,表示用不超時(shí);如果超過等待時(shí)間,則直接拋出JedisConnectionException     */    private static int MAX_WAIT = 60000;        /**     * 每次釋放連接的最大數(shù)目     */    private static int NUM_TESTS_PER_EVICTION_RUN = 10;        /**     * 釋放連接的掃描間隔(毫秒)     */    private static int TIME_BETWEEN_EVICTION_RUNS_MILLIS = 10;        /**     * 連接空閑多久后釋放(毫秒), 當(dāng)空閑時(shí)間>該值 且 空閑連接>最大空閑連接數(shù) 時(shí)直接釋放     */    private static int SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS= 100;        private static int TIMEOUT = 100000;        private static JedisPool jedisPool = null;     private static JedisUtil jedisUtil = null;    protected JedisUtil(){    try{System.out.println("初始化redis緩存!"); JedisPoolConfig config = new JedisPoolConfig();config.setMaxWaitMillis(MAX_WAIT);config.setMaxTotal(MAX_ACTIVE);config.setMaxIdle(MAX_IDLE);config.setMinIdle(MIN_IDLE);config.setTestOnBorrow(TEST_ON_BOOROW);       config.setTestOnReturn(TEST_ON_RETURN);         config.setTestWhileIdle(TEST_WHILE_IDLE);         config.setNumTestsPerEvictionRun(NUM_TESTS_PER_EVICTION_RUN);       config.setTimeBetweenEvictionRunsMillis(TIME_BETWEEN_EVICTION_RUNS_MILLIS);       config.setMinEvictableIdleTimeMillis(SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);jedisPool = new JedisPool(config, "127.0.0.1",PORT,TIMEOUT,"asopa_redis");//jedisPool = new JedisPool(config, "127.0.0.1",PORT);    }catch(Exception e){System.out.println("初始化JedisPool異常:" + e);jedisPool = null;}    }        public static synchronized JedisUtil getInstance(){    if(null == jedisUtil){    jedisUtil = new JedisUtil();    }    return jedisUtil;    }        /**     * 設(shè)置 String     * @param key     * @param value     */    public static void setString(String key ,String value){    Jedis jedis = null;        try {        System.out.println("【存】可用連接數(shù)"+jedisPool.getNumActive());        jedis = jedisPool.getResource();            value = StringUtils.isEmpty(value) ? "" : value;            jedis.set(key,value);        } catch (Exception e) {            System.out.println("Set key error : " + e);        } finally{jedisPool.returnResource(jedis);//注意:每次使用完jedis時(shí)一定要釋放}    }        /**     * 取值     * @param key     * @return     */    public static String get(String key){    Jedis jedis = null;    try{    System.out.println("【取】可用連接數(shù)"+jedisPool.getNumActive());    jedis = jedisPool.getResource();    return jedis.get(key);    }    catch(Exception e){    System.out.println("從緩存中取值失敗:"+e.getMessage());    return null;    } finally{    jedisPool.returnResource(jedis);    }        }

}

2.JedisTestThread 線程類

package JedisTest;/** *  * @author lanchunqiu * */public class JedisTestThread extends Thread{private JedisUtil jedisUtil = null;public JedisTestThread(int i,JedisUtil jedisUtil){System.out.println("=======線程"+i+"========"+jedisUtil.hashCode());this.jedisUtil = jedisUtil;}public void run(){jedisUtil.setString("foo1", "foo1");System.out.println(jedisUtil.get("foo1"));}}

3.測試類:開啟了1000個(gè)線程,如果想要啟動(dòng)更多的線程,就需要調(diào)整MAX_ACTIVE 參數(shù)值,開啟1000個(gè)線程時(shí),我設(shè)置的MAX_ACTIVE =500

package JedisTest;import java.io.IOException;/** *  * @author lanchunqiu * */public class JedisTest {public static void main(String[] args) throws IOException {JedisUtil jedisUtil = JedisUtil.getInstance();for (int i=0;i<1000;i++){JedisTestThread thread1 = new JedisTestThread(i+1,jedisUtil);thread1.start();}}}

4.測試結(jié)果:就算連接數(shù)為0時(shí)也沒出現(xiàn)異常,占用的連接會很快釋放。

還請大牛多指教!

5.使用的jar包:

(1)jedis-2.8.0.jar

(2)commons-pool2-2.4.2.jar

(3)commons-lang-2.4.jar


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉山县| 鄂托克前旗| 盐山县| 宜阳县| 昂仁县| 洛浦县| 乐亭县| 凤庆县| 灯塔市| 育儿| 张家界市| 镇平县| 屯门区| 界首市| 江门市| 陆河县| 塘沽区| 鄂伦春自治旗| 仙居县| 漯河市| 义马市| 山丹县| 阿坝县| 大理市| 青海省| 大荔县| 平原县| 德惠市| 台江县| 京山县| 石景山区| 锦屏县| 新龙县| 潼关县| 荆门市| 嵊泗县| 东丽区| 云阳县| 夏津县| 陕西省| 准格尔旗|