โดยทั่วไปหลังจากที่ไคลเอ็นต์ Redis ออกคำขอมันมักจะบล็อกและรอให้เซิร์ฟเวอร์ Redis ดำเนินการ หลังจากเซิร์ฟเวอร์ Redis เสร็จสิ้นการประมวลผลจะส่งคืนผลลัพธ์ไปยังไคลเอนต์ผ่านข้อความตอบกลับหลังจากขอคำสั่ง
รู้สึกว่านี่เป็นเรื่องคล้ายกับการสแกนของ HBASE โดยปกติไคลเอนต์จะได้รับการบันทึกแต่ละครั้งและเรียกเซิร์ฟเวอร์พร้อมกัน
ใน Redis มีอะไรที่คล้ายกับ HBase Scanner Caching ซึ่งส่งคืนหลายระเบียนตามคำขอเดียวหรือไม่?
ใช่นั่นคือ pipline บทนำอย่างเป็นทางการ http://redis.io/topics/pipelining
เมื่อมีการดำเนินงานจำนวนมากผ่านไปป์ไลน์เราสามารถประหยัดเวลาได้มากในความล่าช้าของเครือข่าย ควรสังเกตว่าคำสั่งถูกบรรจุและส่งโดยใช้ไปป์ไลน์ Redis ต้องแคชผลลัพธ์การประมวลผลของคำสั่งทั้งหมดก่อนประมวลผลคำสั่งทั้งหมด ยิ่งคุณแพ็คคำสั่งมากเท่าใดหน่วยความจำที่คุณบริโภคมากขึ้นเท่านั้น ดังนั้นจึงไม่ใช่คำสั่งที่บรรจุมากขึ้น
เมื่อใช้ไปป์ไลน์ประสิทธิภาพได้รับการปรับปรุงอย่างมากเมื่ออ่านและเขียน Redis เป็นแบทช์
Java ทดสอบแล้ว:
แพ็คเกจ com.lxw1234.redis; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า java.util.set; นำเข้า redis.clients.jedis.jedis; นำเข้า redis.clients.jedis.pipeline; 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 (); // direct hmset สำหรับ (int i = 0; i <10,00000; i ++) {data.clear (); data.put ("k_" + i, "v_" + i); redis.hmset ("key_" + i, data); } Long End = System.currentTimeMillis (); System.out.println ("dbsize: [" + redis.dbsize () + "] .. "); System.out.println ("HMSET โดยไม่ต้องใช้ท่อ [" + (สิ้นสุด - เริ่มต้น) / 1000 + "] วินาที .. "); Redis.Select (8); redis.flushdb (); // ใช้ Pipeline HMSET Pipeline P = Redis.pipelined (); start = system.currentTimeMillis (); สำหรับ (int i = 0; i <10,00000; 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 กับไปป์ไลน์ที่ใช้ [" + (สิ้นสุด - เริ่มต้น) / 1000 + "] วินาที .. "); // hmget set <String> keys = redis.keys ("*"); // ใช้ Jedis hgetall start = system.currentTimeMillis (); แผนที่ <string, map <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 โดยไม่ใช้ไปป์ไลน์ [" + (สิ้นสุด - เริ่มต้น) / 1000 + "] วินาที .. "); // ใช้ Pipeline HGETALL MAP <String, Response <MAP <String, String >>>> การตอบสนอง = new HashMap <String, Response <MAP <String <String, String >>> (keys.size ()); result.clear (); start = system.currentTimeMillis (); สำหรับ (คีย์สตริง: คีย์) {response.put (คีย์, p.hgetall (คีย์)); } p.sync (); สำหรับ (String k: response.keyset ()) {result.put (k, response.get (k) .get ()); } end = system.currentTimeMillis (); System.out.println ("ขนาดผลลัพธ์: [" + result.size () + "] .. "); System.out.println ("hgetall กับไปป์ไลน์ที่ใช้ [" + (สิ้นสุด - เริ่มต้น) / 1000 + "] วินาที .. "); redis.disconnect (); - ผลการทดสอบมีดังนี้:
dbsize: [10,000] .. HMSET โดยไม่ต้องใช้ท่อ [243] วินาที .. DBSIZE: [10,000] .. HMSET พร้อมกับไปป์ไลน์ [0] วินาที .. ขนาดผลลัพธ์: [10,000] .. HGETALL โดยไม่ใช้ท่อ [243] วินาที
การใช้ไปป์ไลน์เพื่ออ่านและเขียน 10,000 ระเบียนในแบทช์เป็นชิ้นส่วนของเค้กและจะทำในไม่กี่วินาที
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น