عند استخدام Jedispool للاتصال بـ Redis ، غالبًا ما يكون جانب Java Deadlocks أثناء التزامن العالي ، أو تقارير استثناءات الاتصال ، أو jedisconnectionexception ، أو استثناءات GetResource وغيرها من المشكلات.
شيئان يجب ملاحظتهما عند استخدام Jedispool
1. أضف مزامنة الخيط عند الحصول على Jedispool و Jedis للتأكد من أنك لا تنشئ الكثير من Jedispool و Jedis.
2. بعد استخدام مثيل Jedis ، تحتاج إلى إعادته إلى Jedispool.
قمت بفرز فئة أداة 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 Tool Class * Author Caspar * */ public class redisutil {محمية reentrantlock lockpool = new reentrantlock () ؛ محمي reentrantlock lockjedis = جديد reentrantlock () ؛ Logger Static Logger المحمي = logger.getLogger (redisutil.class) ؛ // Redis Server IP Static String addr_array = fileutil.getPropertyValue ("/properties/redis.properties" ، "server") ؛ // Redis Port Number private static int port = fileutil.getPropertyValueInt ("/properties/redis.properties" ، "port") ؛ // Access Password // private Static String Auth = fileUtil.getPropertyValue ("/properties/redis.properties" ، "Auth") ؛ // الحد الأقصى لعدد مثيلات الاتصال المتاحة ، القيمة الافتراضية هي 8 ؛ // إذا كانت القيمة -1 ، فهذا لا يعني الحد ؛ إذا كان المسبح قد خصص بالفعل مثيلات Jedis MaxActive ، فإن حالة البركة في هذا الوقت قد استنفدت (Exhaused). private static int max_active = fileutil.getPropertyValueInt ("/properties/redis.properties" ، "max_active") ؛ // جهات الاتصال عدد مثيلات jedis مع خمول الحالة (الخمول) في تجمع ، والقيمة الافتراضية هي أيضا 8. static static int max_idle = fileutil.getPropertyValueint ("/properties.properties" ، "max_idle") ؛؛ // الحد الأقصى للوقت لانتظار الاتصالات المتاحة ، بالمللي ثانية ، تكون القيمة الافتراضية -1 ، مما يشير إلى أنه لن يتم الوصول إلى المهلة. إذا تم تجاوز وقت الانتظار ، فسيتم طرح JedisconnectionException مباشرة ؛ int static int max_wait = fileutil.getPropertyValueint ("/properties/redis.properties" ، "max_wait") ؛ // timeout time private static int timeout = fileutil.getPropertyValueInt ("/properties/redis.properties" ، "timeout") ؛ // عند استعارة مثيل Jedis ، سواء كان للتنفيذ مسبقًا ؛ إذا كان ذلك صحيحًا ، فإن مثيل Jedis الذي تم الحصول عليه متاح ؛ static static boolean test_on_borrow = fileutil.getPropertyValueboolean ("/properties/redis.properties" ، "test_on_borrow") ؛؛ jedispool jedispool الثابتة الخاصة = فارغة ؛ / ***redis وقت انتهاء الصلاحية ، في ثواني*/ عام ثابت int exrp_hour = 60*60 ؛ // ساعة واحدة عامة ثابتة int exrp_day = 60*60*24 ؛ // يوم واحد في النهائي العام الثابت int exrp_month = 60*60*24*30 ؛ ] 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] ، port ، timeout) ؛ } catch (استثناء 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] ، port ، timeout) ؛ } catch (استثناء e2) {logger.error ("Second Create Jedispool Error:"+E2) ؛ }}} /*** التهيئة المتزامنة في بيئة متعددة الخيوط* /pollinit poolinit () {// التأكيد على ما إذا كان قد تم قفل القفل الحالي ، إذا تم قفله ، لا يفعل شيئًا. إذا لم يكن هناك قفل ، فقم بتأكيد الخطوات التالية! lockpool.isheldbyCurrentThread () ؛ lockpool.lock () ؛ حاول {if (jedispool == null) {initialPool () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {lockpool.unlock () ؛ }} 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 () ؛ } إرجاع Jedis ؛ } / *** إطلاق Jedis Resources* param jedis* / public static void returnResource (Final Jedis Jedis) {if (jedis! = null && jedispool! = null) {jedispool.returnresource (jedis) ؛ }} / ** * SET String * @param مفتاح * param value * / setString STATIC STATIC STATIC STATIC STATIC (مفتاح السلسلة ، قيمة السلسلة) {try {value = stringutil.isempty (value)؟ "" : قيمة؛ getjedis (). set (المفتاح ، القيمة) ؛ } catch (استثناء e) {logger.error ("SET KEY ERROR:"+e) ؛ }} / *** تعيين وقت انتهاء الصلاحية* param مفتاح* param Seconds في الثواني* @param value* / public synchronized static void setString (مفتاح سلسلة ، int seconds ، قيمة السلسلة) {try {value = stringutil.isempty (value)؟ "" : قيمة؛ getjedis (). setex (المفتاح ، الثواني ، القيمة) ؛ } catch (استثناء e) {logger.error ("set keyex error:"+e) ؛ }} / ** * احصل على قيمة السلسلة * مفتاح param * return value * / سلسلة ثابتة متزامنة عامة getTring (مفتاح السلسلة) {if (getjedis () == null ||! getJedis (). موجود (مفتاح)) {return null ؛ } return getjedis (). get (key) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.