Jedispool을 사용하여 Redis에 연결할 때, Java 측은 동시에 높은 동시성 중에 교착 상태가 많거나 연결 예외, JedisconnectionException 또는 GetResource 예외 및 기타 문제를보고합니다.
Jedispool을 사용할 때 주목해야 할 두 가지
1. 제다이 풀과 제다이를 얻을 때 스레드 동기화를 추가하여 제다이 풀과 제다이를 너무 많이 생성하지 않도록하십시오.
2. Jedis 인스턴스를 사용한 후에는 Jedispool로 반환해야합니다.
나는 많은 테스트와 높은 동시성 테스트를 통과 한 Redis Tool 클래스를 분류했습니다.
패키지 com.caspar.util; java.util.concurrent.locks.reentrantlock import; import org.apache.log4j.logger; import redis.clients.jedis.jedis; import redis.clients.jedis.jedispool; import redis.clients.jedis.jedispool; import redis.clients.jedis.jedispoolconfig; / ** * redis 도구 클래스 * @author caspar * */ public class redisutil {보호 된 정적 재진입 락 잠금기 = 새로운 reintrantlock (); 보호 된 정적 리 엔트란트 락 잠금 장치 = 새로운 retrantlock (); 보호 된 정적 로거 로거 = logger.getLogger (redisutil.class); // redis server ip private static string addr_array = fileutil.getPropertyValue ( "/properties/redis.properties", "server"); // redis 포트 번호 개인 정적 int port = fileUtil.getPropertyValueInt ( "/properties/redis.properties", "port"); // 암호 액세스 // 개인 정적 문자열 auth = fileUtil.getPropertyValue ( "/properties/redis.properties", "auth"); // 사용 가능한 최대 연결 인스턴스의 기본값은 8입니다. // 값이 -1 인 경우 제한이 없음을 의미합니다. 수영장이 이미 Maxactive Jedis 인스턴스를 할당 한 경우, 현재 풀의 상태가 소진됩니다 (소진). 개인 정적 int max_active = fileUtil.getPropertyValueInt ( "/properties/redis.properties", "max_active"); // 수영장에 상태 유휴 상태가있는 제다이 인스턴스 수 (기본값)도 8입니다. 비공개 정적 int max_idle = fileUtil.getPropertyValueInt ( "/properties/redis.properties", "max_idle");; // 사용 가능한 연결을 기다리는 최대 시간, 밀리 초 단위의 기본값은 -1이므로 시간 초과에 도달하지 않음을 나타냅니다. 대기 시간이 초과되면 JedisconnectionException이 직접 던져집니다. 개인 정적 int max_wait = fileUtil.getPropertyValueInt ( "/properties/redis.properties", "max_wait"); // 시간 초과 시간 개인 정적 int timeout = fileUtil.getPropertyValueInt ( "/properties/redis.properties", "timeout"); // Jedis 인스턴스를 빌릴 때, 유효성 검사를 미리 수행할지 여부; 사실이라면, 획득 된 Jedis 인스턴스를 사용할 수 있습니다. 개인 정적 부울 test_on_borrow = fileUtil.getPropertyValueBoolean ( "/properties/redis.properties", "test_on_borring") ;; Private Static Jedispool Jedispool = null; / ***REDIS 만료 시간, 초의 초기*/ public final static int exrp_hour = 60*60; // 1 시간 공개 최종 정적 int exrp_day = 60*60*24; // 어느 날 공개 최종 정적 int exrp_month = 60*60*24*30; // 한 달/*** Redis 연결 풀을 초기화하십시오*/private static void initialpool () {try {jedispoolconfig config = new jedispoolconfig (); config.setmaxtotal (max_active); config.setmaxidle (max_idle); config.setmaxwaitmillis (max_wait); config.setTestOnborrow (test_on_borrow); Jedispool = New Jedispool (config, addr_array.split ( ",") [0], 포트, 타임 아웃); } catch (예외 e) {logger.error ( "먼저 제다이 풀 오류를 만듭니다 :"+e); 시도 {// 첫 번째 IP가 예외적 인 경우 두 번째 IP JedispoolConfig Config = New JedispoolConfig ()에 액세스하십시오. config.setmaxtotal (max_active); config.setmaxidle (max_idle); config.setmaxwaitmillis (max_wait); config.setTestOnborrow (test_on_borrow); Jedispool = New Jedispool (config, addr_array.split ( ",") [1], 포트, 타임 아웃); } catch (Exception e2) {logger.error ( "두 번째 생성 jedispool 오류 :"+e2); }}} /*** 다중 스레드 환경에서의 동기 초기화* /private static void poolinit () {// 현재 잠금 장치가 잠겨 있는지 여부를 주장합니다. 잠금이 없으면 다음 단계를 수행하십시오! lockpool.isheldbycurrentthread (); lockpool.lock (); try {if (jedispool == null) {initialpool (); }} catch (예외 e) {e.printstacktrace (); } 마침내 {lockpool.unlock (); }} public static jedis getjedis () {// 현재 잠금 장치가 잠겨 있으면 잠긴 경우 아무것도하지 않는지 여부를 주장합니다. 잠금이 없으면 다음 단계를 수행하십시오! lockjedis.isheldbycurrentthread (); lockjedis.lock (); if (jedispool == null) {poolinit (); } Jedis Jedis = null; {if (jedispool! = null) {jedis = jedispool.getResource (); }} catch (예외 e) {logger.error ( "get jedis error :"+e); } 마침내 {returnResource (Jedis); lockjedis.unlock (); } return jedis; } / *** 릴리스 Jedis Resources* @Param Jedis* / public static void returnResource (Final Jedis Jedis) {if (jedis! = null && jedispool! = null) {jedispool.returnresource (jedis); }} / ** * set string * @param key * @param value * / public synchronized static void setstring (문자열 키, 문자열 값) {try {value = stringUtil.isempty (value)? "" : 값; getJedis (). set (key, value); } catch (예외 e) {logger.error ( "키 키 오류 :"+e); }} / *** 만료 시간 설정* @param key* @param 초* @param value* / public synchronized static void setstring (문자열 키, int 초, 문자열 값) {try {value = stringutil.isempty (value)? "" : 값; getJedis (). setex (키, 초, 값); } catch (예외 e) {logger.error ( "set keyex error :"+e); }} / ** * get string value * @param key * @return value * / public synchronized static string getstring (String key) {if (getJedis () == null ||! } return getJedis (). get (key); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.