Jedis接続プールのエントリーレベルでの使用


Jedis接続プールの操作手順は次のとおりです.
a.Jedisインスタンスを取得するにはJedisPoolから取得する必要がある.
b.Jedisインスタンスを使い切るにはJedisPoolに返却する必要がある.
c.Jedisが使用中にエラーが発生した場合、JedisPoolに返却する必要があります.
package com.bijian.study;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisAPI {

	private static JedisPool pool = null;

	public static JedisPool getPool() {
		if (pool == null) {
			JedisPoolConfig config = new JedisPoolConfig();
			//     pool      jedis  ,  pool.getResource()   ;
			//      -1,      ;  pool     maxActive jedis  ,   pool    exhausted(  )。
			config.setMaxActive(500);
			//     pool         idle(   ) jedis  。
			config.setMaxIdle(5);
			//    borrow(  )  jedis   ,       ,        ,     JedisConnectionException;
			config.setMaxWait(1000 * 100);
			//  borrow  jedis   ,      validate  ;   true,    jedis       ;
			config.setTestOnBorrow(true);
			pool = new JedisPool(config, "192.168.128.129", 6379);
		}
		return pool;
	}

	public static void returnResource(JedisPool pool, Jedis redis) {
		if (redis != null) {
			pool.returnResource(redis);
		}
	}

	public static String get(String key) {

		String value = null;
		JedisPool pool = null;
		Jedis jedis = null;
		try {
			pool = getPool();
			jedis = pool.getResource();
			value = jedis.get(key);
		} catch (Exception e) {
			//   redis  
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			//       
			returnResource(pool, jedis);
		}
		return value;
	}
	
	public static void main(String[] args) {
		
		String result = RedisAPI.get("study");
		System.out.println(result);
	}
}

実行結果:redis
redisクライアントget studyによる結果もredisであり、以下に示す.
[root@localhost bin]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> get study
"redis"
127.0.0.1:6379>

コードの説明:
a.jedisインスタンスを取得する場合、実際には2つのエラーが発生する可能性があります.一つはpoolです.getResource()は、使用可能なjedisインスタンスが得られません.もう一つはjedisですset/getでエラーが発生しても異常が放出されます.
区分を実現するために、instanceがnullであるかどうかによって実現され、空であればinstanceが初期化されていないことを証明し、poolにreturnを与える必要はありません.instanceがnullでない場合、poolに返却する必要があることを証明します.
b.instanceエラーが発生した場合、returnBrokenResourceを呼び出してpoolに返却する必要があります.そうしないと、次回getResourceで得られるinstanceのバッファにデータが存在し、問題が発生する可能性があります.
 
JedisPoolの構成JedisPoolConfigの詳細:
JedisPoolの構成パラメータは実際の応用ニーズ、ソフト・ハードウェア能力に大きく依存している.JedisPoolの構成パラメータの大部分はJedisPoolConfigの対応する項によって与えられる.
maxActive:poolに割り当てられるjedisインスタンスの数を制御し、pool.getResource()を取得します.付与値が-1の場合、制限はありません.poolがmaxActive個jedisインスタンスを割り当てた場合、poolの状態はexhaustedになります.
maxIdle:poolがidle(アイドル)のjedisインスタンスを最大数個制御します.
whenExhaustedAction:poolのjedisインスタンスがallocatedで完了した場合、poolが取る操作を示します.デフォルトは3種類あります.
        WHEN_EXHAUSTED_FAIL:jedisインスタンスがない場合、NoSuchElementExceptionを直接放出します.
        WHEN_EXHAUSTED_BLOCK:ブロックされているか、maxWaitに達したときにJedisConnectionExceptionを投げ出すことを示します.
        WHEN_EXHAUSTED_GROW:jedisインスタンスを新規作成することを表します.つまり、設定したmaxActiveは役に立たないと言います.
maxWait:borrowのjedisインスタンスの場合、最大の待機時間を表し、待機時間を超えた場合、JedisConnectionExceptionを直接投げ出す.
testOnBorrow:borrowのjedisインスタンスの場合、alidate操作を事前に行うかどうか.trueの場合、得られたjedisインスタンスはいずれも使用可能である.
testOnReturn:returnがpoolに与えられた場合、validate操作を事前に行うかどうか.
testWhileIdle:trueの場合、idle object evitorスレッドがidle objectをスキャンし、validateが失敗するとpoolからdropされます.これはtimeBetweenEveictionRunsMillisが0より大きい場合にのみ意味がある.
timeBetweenEveictionRunsMillis:idle object evitorの2回のスキャンの間にsleepが必要なミリ秒数を示します.
numTestsPerEveictionRun:idle object evitorがスキャンするたびに最も多くのオブジェクト数を表します.
minEveictableIdleTimeMillis:1つのオブジェクトがidle状態の最短時間にとどまることを示し、idle object evitorにスキャンされて駆逐される.これはtimeBetweenEveictionRunsMillisが0より大きい場合にのみ意味がある.
softMinEveictableIdleTimeMillis:minEveictableIdleTimeMillisに加えて、少なくともminIdle個のオブジェクトがpoolに入っています.-1の場合、evictedはidle timeに基づいてオブジェクトを駆逐しません.m i n v e v i c tableIdleTimeMillis>0の場合、この設定は意味がなく、timeBetweenEveictionRunsMillisが0より大きい場合にのみ意味があります.
lifo:borrowObjectがオブジェクトを返す場合、DEFAULT_を使用します.LIFO(last in first out、すなわちcacheのような最も頻繁に使用されるキュー)は、FalseであればFIFOキューを表す.
JedisPoolConfigのパラメータのデフォルト設定は次のとおりです.
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

 
PS:上記の例はjedis-2.0.0に基づく.jar、commons-pool-1.6.jarが実行されます.
 
記事の出典:http://blog.sina.com.cn/s/blog_67196ddc0101dkz2.html