พื้นหลัง
การตั้งค่าพารามิเตอร์พารามิเตอร์ทรัพยากร Jedispool ที่สมเหตุสมผลสามารถป้องกันการใช้ REDIS สำหรับการใช้งานธุรกิจ บทความนี้จะให้คำอธิบายโดยละเอียดเกี่ยวกับการใช้ Jedispool และพารามิเตอร์ของพูลทรัพยากรและในที่สุดก็ให้การกำหนดค่า "สมเหตุสมผลที่สุด"
1. วิธีใช้
ตัวอย่างอย่างเป็นทางการ 2.9.0 เป็นตัวอย่าง (การเปิดตัวเจได) Maven ขึ้นอยู่กับดังนี้:
<Ederency> <sderctId> redis.Clients </groupId> <ratifactId> Jedis </artifactId> <version> 2.9.0 </เวอร์ชัน> <pope> คอมไพล์ </cope> </derpendency>
Jedis ใช้ Apache Commons-Pool2 เพื่อจัดการพูลทรัพยากรเจไดดังนั้นพารามิเตอร์ที่สำคัญเมื่อกำหนด Jedispool เป็นทรัพยากร Pool GenericobjectPoolConfig การใช้งานมีดังนี้และมีการจัดการทรัพยากรและพารามิเตอร์การใช้งานจำนวนมาก (ดูส่วนที่ 2 สำหรับรายละเอียด)
หมายเหตุ: จะมีการกล่าวถึงในภายหลังว่าขอแนะนำให้ใช้ jedispoolconfig แทน tenericobjectpoolconfig
GenericObjectPoolConfig jedispoolconfig = New GenericObjectPoolConfig (); jedispoolconfig.setmaxtotal (.. ); jedispoolconfig.setmaxidle (.. ); jedispoolconfig.setminidle (.. );
การเริ่มต้นของ Jedispool มีดังนี้:
// Redishost และ Redisport เป็น IP และพอร์ตของอินสแตนซ์ // redispassword เป็นรหัสผ่านของอินสแตนซ์ // หมดเวลาซึ่งเป็นทั้งหมดเวลาเชื่อมต่อและการอ่านและหมดเวลาเขียน ตั้งแต่เจได 2.8 มีตัวสร้างที่แยกความแตกต่างของการเชื่อมต่อเวลาและ sotimeout Jedispool Jedispool = New Jedispool (Jedispoolconfig, Redishost, Redisport, หมดเวลา, Redispassword); Jedis Jedis = null; ลอง {Jedis = Jedispool.getResource (); // คำสั่งเฉพาะ jedis.executecommand ()} catch (ข้อยกเว้น e) {logger.error (e.getMessage (), e);} ในที่สุด {ถ้า (jedis! = null) jedis.close (); // โปรดทราบว่านี่ไม่ได้ปิดการเชื่อมต่อ ในโหมด Jedispool เจไดจะถูกส่งกลับไปยังกลุ่มทรัพยากร -2. คำอธิบายพารามิเตอร์
Jedispool ทำให้มั่นใจได้ว่าทรัพยากรอยู่ในช่วงที่ควบคุมได้และให้ความปลอดภัยของเธรด แต่การกำหนดค่า GenericobjectPoolConfig ที่สมเหตุสมผลสามารถปกป้องแอปพลิเคชันโดยใช้ REDIS นี่คือพารามิเตอร์ที่สำคัญบางส่วน:
ในสภาพแวดล้อมปัจจุบันการเชื่อมต่อของเจไดเป็นทรัพยากรและเจเดสพูลจัดการการเชื่อมต่อเจได
1. การตั้งค่าทรัพยากรและการใช้งาน
| หมายเลขซีเรียล | ชื่อพารามิเตอร์ | ความหมาย | ค่าเริ่มต้น | คำแนะนำสำหรับการใช้งาน |
|---|---|---|---|---|
| 1 | เกี่ยวกับภาพขนาดใหญ่ | จำนวนการเชื่อมต่อสูงสุดในพูลทรัพยากร | 8 | โปรดดูส่วนถัดไปสำหรับการตั้งค่าคำแนะนำ |
| 2 | สูงสุด | จำนวนสูงสุดของการเชื่อมต่อฟรีที่อนุญาตโดยพูลทรัพยากร | 8 | โปรดดูส่วนถัดไปสำหรับการตั้งค่าคำแนะนำ |
| 3 | minidle | พูลทรัพยากรช่วยให้มั่นใจได้ว่ามีการเชื่อมต่อฟรีขั้นต่ำ | 0 | โปรดดูส่วนถัดไปสำหรับการตั้งค่าคำแนะนำ |
| 4 | Blockwhenex | เมื่อพูลทรัพยากรหมดลงไม่ว่าผู้โทรจะต้องการรอ เฉพาะเมื่อจริง Maxwaitmillis ต่อไปนี้จะมีผล | จริง | ขอแนะนำให้ใช้ค่าเริ่มต้น |
| 5 | Maxwaitmillis | เมื่อการเชื่อมต่อพูลทรัพยากรหมดลงเวลารอคอยสูงสุดของผู้โทร (เป็นมิลลิวินาที) | -1: หมายความว่าการหมดเวลาจะไม่เกิน | ไม่แนะนำค่าเริ่มต้น |
| 6 | Testonborrow | ไม่ว่าจะตรวจสอบความถูกต้องของการเชื่อมต่อ (ping) เมื่อยืมการเชื่อมต่อจากพูลทรัพยากรการเชื่อมต่อที่ไม่ถูกต้องจะถูกลบออก | เท็จ | เมื่อปริมาณธุรกิจมีขนาดใหญ่แนะนำให้ตั้งค่าเป็นเท็จ (ค่าใช้จ่ายของ Ping อีกครั้ง) |
| 7 | testonreturn | ไม่ว่าจะตรวจสอบความถูกต้องของการเชื่อมต่อ (ping) เมื่อส่งคืนการเชื่อมต่อไปยังพูลทรัพยากรการเชื่อมต่อที่ไม่ถูกต้องจะถูกลบออก | เท็จ | เมื่อปริมาณธุรกิจมีขนาดใหญ่แนะนำให้ตั้งค่าเป็นเท็จ (ค่าใช้จ่ายของ Ping อีกครั้ง) |
| 8 | jmxenabled | ไม่ว่าจะเปิดใช้งานการตรวจสอบ JMX สามารถใช้สำหรับการตรวจสอบได้ | จริง | ขอแนะนำให้เปิดใช้งาน แต่ต้องเปิดใช้งานแอปพลิเคชันเอง |
2. การตรวจสอบทรัพยากรที่ไม่ได้ใช้งาน
การตรวจจับวัตถุเจไดที่ไม่ได้ใช้งานพารามิเตอร์สี่ตัวต่อไปนี้จะถูกรวมเข้าด้วยกันเพื่อให้เสร็จสิ้นการทดสอบในขณะที่สวิตช์สำหรับฟังก์ชั่นนี้
| หมายเลขซีเรียล | ชื่อพารามิเตอร์ | ความหมาย | ค่าเริ่มต้น | คำแนะนำสำหรับการใช้งาน |
|---|---|---|---|---|
| 1 | ทดสอบในขณะเดียวกัน | ไม่ว่าจะเปิดใช้งานการตรวจสอบทรัพยากรที่ไม่ได้ใช้งาน | เท็จ | จริง |
| 2 | Timebetweenevictionrunsmillis | ระยะเวลาการตรวจจับทรัพยากรที่ไม่ได้ใช้งาน (เป็นมิลลิวินาที) | -1: ไม่มีการตรวจจับ | ขอแนะนำให้ตั้งค่าการตั้งค่าเลือกรอบด้วยตัวคุณเองหรือคุณสามารถใช้การกำหนดค่าใน JedispoolConfig โดยค่าเริ่มต้นหรือใช้การกำหนดค่าต่อไปนี้ |
| 3 | minevictableidletimemillis | เวลาว่างขั้นต่ำของทรัพยากรในกลุ่มทรัพยากร (เป็นมิลลิวินาที) หลังจากถึงค่านี้ทรัพยากรที่ไม่ได้ใช้งานจะถูกลบออก | 10006030 = 30 นาที | คุณสามารถตัดสินใจได้ตามธุรกิจของคุณเองค่าเริ่มต้นส่วนใหญ่เพียงพอหรือคุณสามารถพิจารณาใช้การกำหนดค่าต่อไปนี้ใน JeidSpoolConfig |
| 4 | numtestsperevictionrun | เมื่อทำการตรวจจับทรัพยากรที่ไม่ได้ใช้งานจำนวนตัวอย่างในแต่ละครั้ง | 3 | คุณสามารถปรับแต่งตามจำนวนการเชื่อมต่อที่คุณใช้ หากตั้งค่าเป็น -1 คุณจะทำการตรวจสอบการเชื่อมต่อทั้งหมดที่ไม่ได้ใช้งาน |
เพื่อความสะดวกในการใช้งาน Jedis ให้ JedispoolConfig ซึ่งสืบทอด TenericobjectPoolConfig และตั้งค่าการตรวจสอบที่ไม่ได้ใช้งาน
Public Class JedispoolConfig ขยาย GenericObjectPoolConfig {Public JedispoolConfig () {// ค่าเริ่มต้นเพื่อทำให้ชีวิตของคุณกับกลุ่มการเชื่อมต่อง่ายขึ้น :) ตั้งถิ่นฐานในขณะเดียวกัน (จริง); // setMinevictableidletimeMillis (60000); // settimebetweenevictionrunsmillis (30000); SetnumtestsperevictionRun (-1); -ค่าเริ่มต้นทั้งหมดสามารถเห็นได้จาก org.apache.commons.pool2.impl.baseobjectpoolconfig
3. ขนาดพูลทรัพยากร (maxtotal), ไม่ได้ใช้งาน (maxidle minidle) คำแนะนำการตั้งค่า
1. MAXTOTAL: จำนวนการเชื่อมต่อสูงสุด
อันที่จริงนี่เป็นคำถามที่ตอบยากและมีหลายปัจจัยที่ต้องพิจารณา:
ยกตัวอย่างเพื่อแสดงโดยสมมติว่า:
จากนั้นขนาดพูลทรัพยากรที่จำเป็นในทางทฤษฎีคือ 50000 /1000 = 50 แต่ในความเป็นจริงนี่คือค่าทางทฤษฎีและจำเป็นต้องพิจารณาว่าทรัพยากรบางอย่างจำเป็นต้องสงวนไว้มากกว่าค่าทางทฤษฎี โดยทั่วไปแล้วแม็กซัตอาจมีขนาดใหญ่กว่าค่าทางทฤษฎี
แต่ยิ่งมีค่ามากเท่าไหร่ก็ยิ่งดีเท่านั้น ในอีกด้านหนึ่งการเชื่อมต่อนั้นมากเกินไปที่จะครอบครองทรัพยากรไคลเอนต์และเซิร์ฟเวอร์ ในทางกลับกันสำหรับเซิร์ฟเวอร์เช่น Redis ที่มี QPS สูงการปิดกั้นคำสั่งขนาดใหญ่จะยังคงไร้ประโยชน์แม้ว่าคุณจะตั้งค่าพูลทรัพยากรขนาดใหญ่
2. maxidle minidle
Maxidle เป็นจำนวนการเชื่อมต่อสูงสุดที่ธุรกิจต้องการ Maxtotal คือการให้มาร์จิ้นดังนั้น Maxidle จึงไม่ควรตั้งค่าขนาดเล็กเกินไปมิฉะนั้นจะมีค่าใช้จ่ายใหม่ (การเชื่อมต่อใหม่) ใหม่ในขณะที่ Minidle คือการควบคุมการตรวจสอบทรัพยากรที่ไม่ได้ใช้งาน
ประสิทธิภาพที่ดีที่สุดของกลุ่มการเชื่อมต่อคือ maxtotal = maxidle ซึ่งหลีกเลี่ยงการรบกวนประสิทธิภาพที่เกิดจากการปรับสเกลการเชื่อมต่อ อย่างไรก็ตามหากการเกิดขึ้นพร้อมกันไม่ใหญ่หรือมีการตั้งค่า maxtotal สูงเกินไปมันจะนำไปสู่การสูญเสียทรัพยากรการเชื่อมต่อที่ไม่จำเป็น
พูลการเชื่อมต่อที่ใช้โดยแต่ละโหนดสามารถประเมินได้โดยรวมตาม OPS ทั้งหมดจริงและขนาดของไคลเอนต์การโทร REDIS
3. การตรวจสอบ
ในความเป็นจริงค่าที่น่าเชื่อถือที่สุดคือการได้รับ "ค่าที่เหมาะสมที่สุด" ผ่านการตรวจสอบ คุณสามารถพิจารณาการใช้การตรวจสอบด้วยวิธีการบางอย่าง (เช่น JMX) เพื่อค้นหาค่าที่สมเหตุสมผล
4. คำถามที่พบบ่อย
1. ทรัพยากร "ไม่เพียงพอ"
redis.clients.jedis.exceptions.jedisconnectionexception: ไม่สามารถรับทรัพยากรจากสระ ... เกิดจาก: java.util.nosuchelementexception: หมดเวลารอการใช้งาน Objectat org.apache.commons.pool2.impl.enericobjectpool.borowject
หรือ
redis.clients.jedis.exceptions.jedisconnectionexception: ไม่สามารถรับทรัพยากรจากสระ ... เกิดจาก: java.util.nosuchelementexception: พูลที่หมดไป
ทั้งสองกรณีไม่สามารถที่จะได้รับทรัพยากรจากกลุ่มทรัพยากร แต่ครั้งแรกคือการหมดเวลาและที่สองเป็นเพราะ blockwhenexeded เป็นเท็จและไม่เท่ากันเลย
เมื่อพบข้อยกเว้นดังกล่าวอย่าคิดอย่างสุ่มสี่สุ่มห้าว่ากลุ่มทรัพยากรไม่ใหญ่พอ ส่วนที่สามได้รับการวิเคราะห์ ด้วยเหตุผลเฉพาะคุณสามารถตรวจสอบ: เครือข่าย, การตั้งค่าพารามิเตอร์พูลทรัพยากร, การตรวจสอบพูลทรัพยากร (หากมีการตรวจสอบ JMX), รหัส (ตัวอย่างเช่นไม่ดำเนินการ jdis.close ()), การสืบค้นช้า, DNS และปัญหาอื่น ๆ
สำหรับรายละเอียดโปรดดูบทความนี้: https://www.atatech.org/articles/77799
2. อุ่นเจดริสบูล
เนื่องจากเหตุผลบางอย่าง (เช่นการตั้งค่าเวลาหมดเวลามีขนาดเล็ก) บางโครงการจะหมดเวลาหลังจากเริ่มต้นประสบความสำเร็จ เมื่อ Jedispool กำหนดจำนวนทรัพยากรสูงสุดและจำนวนทรัพยากรฟรีขั้นต่ำมันจะไม่ทำให้การเชื่อมต่อเจไดเข้ากับสระว่ายน้ำ เมื่อใช้เป็นครั้งแรกสระว่ายน้ำไม่มีทรัพยากรดังนั้นมันจะใหม่เจได หลังจากใช้งานแล้วมันอาจทำให้เกิดค่าใช้จ่ายในช่วงเวลาหนึ่ง ดังนั้นคุณยังสามารถพิจารณาการอุ่นสำหรับ Jedispool ล่วงหน้าหลังจากคำจำกัดความของ Jedispool ตัวอย่างเช่นจำนวนขั้นต่ำฟรีคือปริมาณการอุ่น
รายการ <jedis> minidlejediSlist = new ArrayList <Jedis> (Jedispoolconfig.getMinidle ()); สำหรับ (int i = 0; i <jedispoolconfig.getMinidle (); i ++) {Jedis jedis = null; ลอง {jedis = pool.getResource (); minidlejedislist.add (เจได); jedis.ping (); } catch (exception e) {logger.error (e.getMessage (), e); } ในที่สุด {}} สำหรับ (int i = 0; i <jedispoolconfig.getMinidle (); i ++) {Jedis jedis = null; ลอง {jedis = minidlejediSlist.get (i); Jedis.close (); } catch (exception e) {logger.error (e.getMessage (), e); } ในที่สุด { }}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น