خلفية
يمكن أن تحمي الإعدادات المعقولة لمجموعة Jedispool Goot Pool من استخدام Redis لاستخدام الأعمال. ستوفر هذه المقالة شرحًا مفصلاً لاستخدام Jedispool ومعلمات تجمع الموارد ، وأخيراً إعطاء التكوين "الأكثر منطقية".
1. كيفية الاستخدام
أخذ المسؤول 2.9.0 كمثال (إصدار Jedis) ، يعتمد Maven على النحو التالي:
<Rependency> <roupend> redis.clients </rougiD> <StifactId> jedis </shintifactid> <الإصدار> 2.9.0 </version> <scope> ترجمة </scope> </premed>
يستخدم Jedis Apache Commons-Pool2 لإدارة مجموعة موارد Jedis ، وبالتالي فإن معلمة مهمة عند تحديد Jedispool هي تجمع الموارد GenericObjectPoolConfig. الاستخدام كما يلي ، وهناك العديد من معلمات إدارة الموارد والاستخدام (انظر القسم 2 للحصول على التفاصيل)
ملاحظة: سيتم ذكر لاحقًا أنه يوصى باستخدام JedispoolConfig بدلاً من GenericObjectPoolConfig
GenericObjectPoolConfig jedispoolconfig = جديد genericobjectpoolconfig () ؛ jedispoolconfig.setmaxtotal (..) ؛ jedispoolconfig.setmaxidle (..) ؛
تهيئة Jedispool كما يلي:
. منذ Jedis 2.8 ، هناك مُنشئ يميز ConnectionTimeOut و sotimeout. Jedispool Jedispool = New Jedispool (JedispoolConfig ، Redishost ، redisport ، timeout ، redispassword) ؛ jedis jedis = null ؛ حاول {jedis = jedispool.getResource () ؛ // أمر محدد jedis.executecommand ()} catch (استثناء e) {logger.error ( // لاحظ أن هذا لا يغلق الاتصال. في وضع Jedispool ، سيتم إرجاع Jedis إلى مجموعة الموارد. }2. وصف المعلمة
يضمن Jedispool أن تكون الموارد ضمن نطاق يمكن التحكم فيها وتوفير سلامة مؤشر الترابط ، ولكن يمكن أن يحمي تكوين GenericObjectPoolConfig التطبيقات باستخدام Redis. فيما يلي بعض المعلمات المهمة:
في البيئة الحالية ، يعد اتصال Jedis موردًا ، ويدير Jedispool اتصال Jedis.
1. إعداد الموارد والاستخدام
| رقم سري | اسم المعلمة | معنى | القيمة الافتراضية | توصيات للاستخدام |
|---|---|---|---|---|
| 1 | Maxtotal | الحد الأقصى لعدد الاتصالات في تجمع الموارد | 8 | يرجى الرجوع إلى القسم التالي لإعداد الاقتراحات |
| 2 | Maxidle | الحد الأقصى لعدد الاتصالات المجانية التي يسمح بها مجموعة الموارد | 8 | يرجى الرجوع إلى القسم التالي لإعداد الاقتراحات |
| 3 | Minidle | يضمن تجمع الموارد الحد الأدنى لعدد الاتصالات المجانية | 0 | يرجى الرجوع إلى القسم التالي لإعداد الاقتراحات |
| 4 | blockwhenexhaugh | عندما يتم استنفاد تجمع الموارد ، ما إذا كان المتصل يريد الانتظار. فقط عندما يكون صحيحًا ، فإن maxwaitmillis التالي سوف يسري سريعة | حقيقي | يوصى باستخدام القيم الافتراضية |
| 5 | maxwaitmillis | عندما يتم استنفاد اتصال تجمع الموارد ، أقصى وقت انتظار للمتصل (بالميلي ثانية) | -1: يعني أنه لن يتم تجاوز المهلة أبدًا | لا ينصح القيمة الافتراضية |
| 6 | testonborrow | ما إذا كنت تريد التحقق من صحة الاتصال (PING) عند استعارة اتصال من مجموعة الموارد ، ستتم إزالة اتصال غير صالح | خطأ شنيع | عندما يكون حجم الأعمال كبيرًا ، يوصى بتعيين كاذب (النفقات العامة من بينغ مرة أخرى). |
| 7 | testOnreturn | ما إذا كنت تريد التحقق من صحة الاتصال (PING) عند إرجاع الاتصال إلى تجمع الموارد ، ستتم إزالة الاتصال غير الصالح | خطأ شنيع | عندما يكون حجم الأعمال كبيرًا ، يوصى بتعيين كاذب (النفقات العامة من بينغ مرة أخرى). |
| 8 | JmxEnabled | سواء كان لتمكين مراقبة JMX ، يمكن استخدامه للمراقبة | حقيقي | يوصى بتمكينه ، ولكن يجب أيضًا تمكين التطبيق نفسه. |
2. مراقبة موارد الخمول
الكشف عن كائن jedis الخمول ، يتم الجمع بين المعلمات الأربعة التالية لإكمالها ، والاختبار هو مفتاح هذه الوظيفة.
| رقم سري | اسم المعلمة | معنى | القيمة الافتراضية | توصيات للاستخدام |
|---|---|---|---|---|
| 1 | اختبار | سواء لتمكين مراقبة الموارد الخاملة | خطأ شنيع | حقيقي |
| 2 | TimeBetweenevictionRunsmillis | فترة الكشف عن موارد الخمول (بالميلي ثانية) | -1: لا يوجد اكتشاف | يوصى بتعيين الإعدادات ، وتحديد الدورة بنفسك ، أو يمكنك استخدام التكوين في JedispoolConfig افتراضيًا أو استخدام التكوين التالي. |
| 3 | MINEVICTABLEIDLETEMEMILIS | الحد الأدنى لوقت الخمول للموارد في تجمع الموارد (بالميلي ثانية). بعد الوصول إلى هذه القيمة ، سيتم إزالة مورد الخمول. | 10006030 = 30 دقيقة | يمكنك أن تقرر بناءً على عملك الخاص ، معظم القيم الافتراضية كافية ، أو يمكنك التفكير في استخدام التكوين التالي في JeidspoolConfig |
| 4 | numtestsperimentrun | عند إجراء الكشف عن موارد الخمول ، فإن عدد العينات في كل مرة | 3 | يمكنك ضبطها وفقًا لعدد الاتصالات التي تطبقها. إذا تم ضبطها على -1 ، فستقوم بمراقبة الخمول لجميع الاتصالات. |
لراحة الاستخدام ، يوفر Jedis JedispoolConfig ، والذي يرث نفسه GenericObjectPoolConfig ويضع بعض إعدادات مراقبة الخمول.
الطبقة العامة JedispoolConfig تمتد genericobjectpoolconfig {public jedispoolconfig () {// الافتراضيات لجعل حياتك مع تجمع الاتصال أسهل :) settesthileIdle (true) ؛ // setMineVictableDletimemillis (60000) ؛ // setTimeBetweenevictionRunsmillis (30000) ؛ setNumTestSperutionRun (-1) ؛ }}يمكن رؤية جميع القيم الافتراضية من org.apache.commons.pool2.impl.baseObjectPoolConfig.
3. حجم تجمع الموارد (maxtotal) ، اقتراحات الإعدادات الخاملة (maxidle minidle)
1.maxtotal: الحد الأقصى لعدد الاتصالات
في الواقع ، هذا سؤال صعب الإجابة عليه ، وهناك العديد من العوامل التي يجب مراعاتها:
خذ مثالاً لتوضيح ، على افتراض:
ثم يكون حجم تجمع الموارد المطلوب من الناحية النظرية 50000 /1000 = 50. ولكن في الواقع ، هذه قيمة نظرية ، ومن الضروري النظر في أن بعض الموارد تحتاج إلى حجز من القيمة النظرية. بشكل عام ، يمكن أن يكون Maxtotal أكبر من القيمة النظرية.
ولكن كلما كانت القيمة أكبر ، كلما كان ذلك أفضل. من ناحية ، فإن الاتصال أكثر من اللازم لاحتلال موارد العميل والخادم. من ناحية أخرى ، بالنسبة لخوادم مثل redis ذات QPs عالية ، فإن حظر أمر كبير سيظل عديم الفائدة حتى لو قمت بإعداد مجموعة كبيرة من الموارد.
2. maxidle minidle
Maxidle هو في الواقع الحد الأقصى لعدد الاتصالات التي تتطلبها الأعمال. MaxtOtal هو إعطاء الهامش ، لذلك لا ينبغي تعيين maxidle صغير جدًا ، وإلا سيكون هناك جديس (اتصال جديد) جديد ، في حين أن Minidle هو التحكم في مراقبة الموارد الخاملة.
أفضل أداء لمجموعة الاتصال هو maxtotal = maxidle ، والذي يتجنب تداخل الأداء الناجم عن تحجيم تجمع الاتصال. ومع ذلك ، إذا لم يكن التزامن كبيرًا أو تم تعيين muxtotal مرتفعة للغاية ، فسيؤدي ذلك إلى مضيعة موارد الاتصال غير الضرورية.
يمكن تقييم تجمع الاتصال المستخدمة من قبل كل عقدة بشكل عام استنادًا إلى إجمالي العمليات الفعلية وحجم عميل Redis للاتصال.
3. المراقبة
في الواقع ، فإن القيمة الأكثر موثوقية هي الحصول على "القيمة المثلى" من خلال المراقبة. يمكنك التفكير في تنفيذ المراقبة من خلال بعض الوسائل (مثل JMX) لإيجاد قيم معقولة.
4. الأسئلة المتداولة
1. الموارد "غير الكافية"
redis.clients.jedis.exceptions.jedisconnectionexception: لا يمكن الحصول على مورد من المجمع ... سبب: java.util.noselementException: مهلة في انتظار كائن خامل org.apache.commons.pool2.impl.menericobjectpool.browrowbject (genericobjectpool.java:49)
أو
redis.clients.jedis.exceptions.jedisconnectionexception: لا يمكن الحصول على مورد من التجمع ... سبب: java.util.noselementexception: pool arvidedat org.apache.commons.pool2.impl.GenericObjectPool.borrownobject (genericobjectpool.java:464)
كلتا الحالتين هما عدم القدرة على الحصول على موارد من تجمع الموارد ، ولكن الأول هو المهلة ، والثاني هو أن blockwhenexhaugh هو خطأ وليست متساوية على الإطلاق.
عند مواجهة مثل هذا الاستثناء ، لا تفكر بشكل أعمى أن تجمع الموارد ليس كبيرًا بما يكفي. تم تحليل القسم الثالث. لأسباب محددة ، يمكنك التحقق من: الشبكة ، وإعدادات معلمة تجمع الموارد ، ومراقبة تجمع الموارد (إذا تم مراقبة JMX) ، والرمز (على سبيل المثال ، لا تنفذ jdis.close () ، والاستعلام البطيء ، و DNS وغيرها من المشكلات.
للحصول على تفاصيل ، يرجى الرجوع إلى هذا المقال: https://www.atatech.org/articles/77799
2. سخن jedispool
نظرًا لبعض الأسباب (مثل إعداد وقت المهلة ، فإن بعض المشاريع ستنتقل بعد بدء التشغيل الناجح. عندما يحدد Jedispool الحد الأقصى لعدد الموارد والحد الأدنى لعدد الموارد المجانية ، فإنه لن يضع اتصال Jedis حقًا في المجمع. عندما يتم استخدامه لأول مرة ، لا يوجد في المجمع أي موارد ، لذلك سوف يقوم New Jedis. بعد استخدامه ، قد يسبب وقتًا معينًا. لذلك ، يمكنك أيضًا التفكير في التسخين لجديسبول مقدمًا بعد تعريف Jedispool ، على سبيل المثال ، فإن الحد الأدنى للرقم الحر هو الكمية المسبقة.
قائمة <Jedis> minidlejedislist = new ArrayList <Jedis> (JedispoolConfig.getMinidle ()) ؛ لـ (int i = 0 ؛ i <jedispoolconfig.getMinidle () ؛ i ++) {jedis jedis = null ؛ حاول {jedis = pool.getResource () ؛ minidlejedislist.add (jedis) ؛ jedis.ping () ؛ } catch (استثناء e) {logger.error (e.getMessage () ، e) ؛ } أخيرًا {}} لـ (int i = 0 ؛ i <jedispoolconfig.getMinIdle () ؛ i ++) {jedis jedis = null ؛ حاول {jedis = minidlejedislist.get (i) ؛ jedis.close () ؛ } catch (استثناء e) {logger.error (e.getMessage () ، e) ؛ } أخيراً { }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.