เมื่อใช้ Jedispool เพื่อเชื่อมต่อกับ Redis ฝั่ง Java มักจะหยุดชะงักในระหว่างการพร้อมกันที่สูงหรือรายงานข้อยกเว้นการเชื่อมต่อ, JedisconnectionException หรือข้อยกเว้น GetResource และปัญหาอื่น ๆ
สองสิ่งที่ควรทราบเมื่อใช้ Jedispool
1. เพิ่มการซิงโครไนซ์เธรดเมื่อได้รับ Jedispool และ Jedis เพื่อให้แน่ใจว่าคุณไม่ได้สร้าง Jedispool และ Jedis มากเกินไป
2. หลังจากใช้อินสแตนซ์ของเจดิสแล้วคุณจะต้องส่งคืนกลับไปที่เจเดสต์
ฉันจัดเรียงคลาสเครื่องมือ Redis ซึ่งผ่านการทดสอบจำนวนมากและการทดสอบพร้อมกันสูง
แพ็คเกจ com.caspar.util; นำเข้า java.util.concurrent.locks.reentrantlock; นำเข้า org.apache.log4j.logger; นำเข้า redis.clients.jedis.jedis; นำเข้า redis.clients.jedis.jedispool; นำเข้า redis.clients.jedis.jedispool; นำเข้า redis.clients.jedis.jedispoolconfig; / ** * คลาสเครื่องมือ redis * @author caspar * */ คลาสสาธารณะ redisutil {ป้องกัน reentrantlock lockpool = new reentrantlock (); ได้รับการป้องกัน reentrantlock lockjedis = ใหม่ reentrantlock (); logger logger แบบคงที่ได้รับการป้องกัน = logger.getLogger (redisutil.class); // REDIS Server IP สตริงคงที่ส่วนตัว addr_array = fileUtil.getPropertyValue ("/properties/redis.properties", "เซิร์ฟเวอร์"); // หมายเลขพอร์ต REDIS พอร์ตส่วนตัวพอร์ต int คงที่ = fileUtil.getPropertyValueInt ("/คุณสมบัติ/redis.properties", "พอร์ต"); // เข้าถึงรหัสผ่าน // สตริงคงที่ส่วนตัว Auth = fileUtil.getProperTyValue ("/properties/redis.properties", "auth"); // จำนวนสูงสุดของอินสแตนซ์การเชื่อมต่อที่มีอยู่ค่าเริ่มต้นคือ 8; // ถ้าค่าคือ -1 มันหมายถึงไม่มีขีด จำกัด ; หากสระว่ายน้ำได้จัดสรรอินสแตนซ์ของเจไดที่มีการออกฤทธิ์สูงสุดแล้วสถานะของพูลในเวลานี้จะหมดลง (exhaused) ส่วนตัว int max_active = fileutil.getPropertyValueInt ("/properties/redis.properties", "max_active"); // ผู้ติดต่อจำนวนอินสแตนซ์เจไดที่มีสถานะไม่ได้ใช้งาน (ไม่ได้ใช้งาน) ในพูลค่าเริ่มต้นคือ 8. int max_idle ส่วนตัวคงที่ส่วนตัว = fileUtil.getPropertyValueInt ("/คุณสมบัติ/redis.properties", "max_idle") ;; // เวลาสูงสุดในการรอการเชื่อมต่อที่มีอยู่ในมิลลิวินาทีค่าเริ่มต้นคือ -1 ซึ่งบ่งชี้ว่าการหมดเวลาจะไม่ถึง หากเกินเวลารอคอยการเจดีย์เจดีย์จะถูกโยนลงไปโดยตรง ส่วนตัวคงที่ int max_wait = fileutil.getPropertyValueInt ("/properties/redis.properties", "max_wait"); // เวลาหมดเวลาส่วนตัวคงที่ int timeout = fileutil.getPropertyValueInt ("/properties/redis.properties", "หมดเวลา"); // เมื่อยืมอินสแตนซ์ของเจดิสไม่ว่าจะทำการตรวจสอบล่วงหน้าหรือไม่ หากเป็นจริงอินสแตนซ์เจไดที่ได้รับจะพร้อมใช้งาน; บูลีนแบบคงที่ส่วนตัว test_on_borrow = fileutil.getPropertyValueBoolean ("/คุณสมบัติ/redis.properties", "test_on_borrow") ;; เจ็ดดิสบูลเจดริสบูลส่วนตัว = NULL; / ***เวลาหมดอายุของ Redis ในวินาที*/ สาธารณะสุดท้ายคงที่ int exrp_hour = 60*60; // หนึ่งชั่วโมงสาธารณะสุดท้ายคงที่ int exrp_day = 60*60*24; // หนึ่งวันสาธารณะสุดท้ายคงที่ int exrp_month = 60*60*24*30; // หนึ่งเดือน/*** เริ่มต้น Redis Connection Pool*/Private Static Void InitialPool () {ลอง {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 (exception e) {logger.error ("แรกสร้างข้อผิดพลาด jedispool:"+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); }}} /*** การเริ่มต้นแบบซิงโครนัสในสภาพแวดล้อมแบบมัลติเธรด* /โมฆะคงที่พูลใน () {// ยืนยันว่าล็อคปัจจุบันถูกล็อคหรือไม่หากถูกล็อคไม่ทำอะไรเลย หากไม่มีการล็อคให้ทำตามขั้นตอนต่อไปนี้! lockpool.isheldbycurrentthread (); lockpool.lock (); ลอง {ถ้า (jedispool == null) {initialPool (); }} catch (exception e) {e.printstacktrace (); } ในที่สุด {lockpool.unlock (); }} สาธารณะคงที่ Jedis getJedis () {// ยืนยันว่าล็อคปัจจุบันถูกล็อคหรือไม่ถ้ามันถูกล็อคไม่ทำอะไรเลย หากไม่มีการล็อคให้ทำตามขั้นตอนต่อไปนี้! lockjedis.isheldbycurrentthread (); lockjedis.lock (); if (jedispool == null) {poolinit (); } Jedis Jedis = null; ลอง {ถ้า (jedispool! = null) {jedis = jedispool.getResource (); }} catch (exception e) {logger.error ("รับข้อผิดพลาดของเจได:"+e); } ในที่สุด {returnResource (Jedis); lockjedis.unlock (); } return Jedis; } / *** รีลีสทรัพยากร Jedis* @param jedis* / โมฆะคงที่สาธารณะ returnresource (สุดท้ายเจไดเจดิส) {ถ้า (เจได! = null && jedispool! = null) {jedispool.returnresource (Jedis); }} / ** * ตั้งค่าสตริง * @param คีย์ * @param value * / public synchronized void setString (คีย์สตริง, ค่าสตริง) {ลอง {value = stringUtil.isEmpty (ค่า)? "" : ค่า; getJedis (). set (คีย์, ค่า); } catch (exception e) {logger.error ("ตั้งค่าคีย์ข้อผิดพลาด:"+e); }} / *** ตั้งเวลาหมดอายุ* @param คีย์* @param วินาทีในวินาที* @param value* / สาธารณะที่ซิงโครไนซ์สแตติก setstring (คีย์สตริง, วินาที int, ค่าสตริง) {ลอง {value = stringutil.isempty (ค่า)? "" : ค่า; getJedis (). setex (คีย์, วินาที, ค่า); } catch (exception e) {logger.error ("ตั้งค่าข้อผิดพลาด keyex:"+e); }} / ** * รับค่าสตริง * @param คีย์ * @return value * / สตริงคงที่แบบซิงโครไนซ์สาธารณะ getString (คีย์สตริง) {ถ้า (getJedis () == null ||! getJedis () มีอยู่ (คีย์)) } return getjedis (). get (key); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น