بشكل عام ، بعد أن يصدر عميل Redis طلبًا ، عادةً ما يحجب وينتظر معالجة خادم Redis. بعد أن يكمل خادم Redis المعالجة ، سيعيد النتيجة إلى العميل من خلال رسالة الاستجابة بعد طلب الأمر.
يبدو أن هذا يشبه إلى حد ما فحص HBase. عادة ، يحصل العميل على كل سجل ويتصل بالخادم مرة واحدة.
في Redis ، هل هناك أي شيء مشابه للتخزين المؤقت لـ HBase Scanner ، والذي يعيد سجلات متعددة بطلب واحد؟
نعم ، هذا هو خط المشاعر. مقدمة رسمية http://redis.io/topics/pipelining
عندما تكون هناك مجموعات كبيرة من العمليات عبر خط أنابيب ، يمكننا توفير الكثير من الوقت الضائع على تأخيرات الشبكة. تجدر الإشارة إلى أن الأوامر يتم تعبئتها وإرسالها باستخدام خط الأنابيب. يجب على Redis تخزين نتائج المعالجة لجميع الأوامر قبل معالجة جميع الأوامر. كلما زاد عدد الأوامر التي تحزمها ، زادت الذاكرة التي تستهلكها. لذلك ليس الأمر هو أن الأوامر المعبأة أكثر ، كلما كان ذلك أفضل.
عند استخدام خط الأنابيب ، تم تحسين الأداء بشكل كبير عند قراءة وكتابة Redis على دفعات.
اختبرها جافا:
حزمة com.lxw1234.redis ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد java.util.set ؛ redis.clients.jedis.jedis redis = New Jedis ("127.0.0.1" ، 6379 ، 400000) ؛ خريطة <string ، string> data = new hashmap <string ، string> () ؛ redis.select (8) ؛ redis.flushdb () ؛ // hmset long start = system.currentTimeMillis () ؛ // hmset direct for (int i = 0 ؛ i <10000 ؛ i ++) {data.clear () ؛ data.put ("k_" + i ، "v_" + i) ؛ redis.hmset ("key_" + i ، data) ؛ } نهاية طويلة = system.currentTimeMillis () ؛ system.out.println ("dbsize: [" + redis.dbsize () + "] ..") ؛ System.out.println ("HMSET بدون خط أنابيب يستخدم [" + (end - start) / 1000 + "] Seconds ..") ؛ redis.select (8) ؛ redis.flushdb () ؛ // استخدام خط أنابيب خط أنابيب pipeline p = redis.peled () ؛ start = system.currentTimeMillis () ؛ لـ (int i = 0 ؛ i <10000 ؛ i ++) {data.clear () ؛ data.put ("k_" + i ، "v_" + i) ؛ p.hmset ("key_" + i ، data) ؛ } p.sync () ؛ end = system.currentTimeMillis () ؛ system.out.println ("dbsize: [" + redis.dbsize () + "] ..") ؛ System.out.println ("HMSET مع خط الأنابيب المستخدمة [" + (end - start) / 1000 + "] Seconds ..") ؛ // HMGET SET <STRING> KEYS = REDIS.KEYS ("*") ؛ // استخدم jedis hgetall start = system.currentTimeMillis () ؛ خريطة <string ، خريطة <string ، string >> result = new hashmap <string ، map <string ، string >> () ؛ لـ (مفتاح السلسلة: مفاتيح) {result.put (المفتاح ، redis.hgetall (مفتاح)) ؛ } end = system.currentTimeMillis () ؛ System.out.println ("حجم النتيجة: [" + result.size () + "] ..") ؛ System.out.println ("hgetall بدون خط أنابيب يستخدم [" + (end - start) / 1000 + "] Seconds ..") ؛ // استخدم خريطة خط الأنابيب HgetAll <string ، استجابة <map <string ، string >>>> responses = new hashmap <string ، response <map <string ، string >>> (keys.size ()) ؛ النتيجة. clear () ؛ start = system.currentTimeMillis () ؛ لـ (مفتاح السلسلة: Keys) {replys.put (Key ، P.HgetAll (key)) ؛ } p.sync () ؛ لـ (string k: reply.keyset ()) {result.put (k ، responses.get (k) .get ()) ؛ } end = system.currentTimeMillis () ؛ System.out.println ("حجم النتيجة: [" + result.size () + "] ..") ؛ System.out.println ("hgetall مع خط الأنابيب المستخدمة [" + (end - start) / 1000 + "] Seconds ..") ؛ redis.disconnect () ؛ }} نتائج الاختبار كما يلي:
DBSISE: [10000] .. HMSET بدون خط أنابيب مستخدم [243] ثواني .. DBSISE: [10000] .. HMSET مع خط أنابيب مستخدم [0] ثانية .. حجم النتيجة: [10000] .. HGETALL دون استخدام خط أنابيب [243] ثانية .. حجم النتيجة: [10000]
يعد استخدام خط الأنابيب لقراءة وكتابة 10000 سجل على دفعات قطعة من الكعكة وسيتم ذلك في ثوانٍ.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.