En términos generales, después de que el cliente de Redis emite una solicitud, generalmente bloquea y espera a que el servidor Redis procese. Después de que el servidor Redis complete el procesamiento, devolverá el resultado al cliente a través del mensaje de respuesta después de solicitar el comando.
Parece que esto es un poco similar al escaneo de HBase. Por lo general, el cliente obtiene cada registro y llama al servidor a la vez.
En Redis, ¿hay algo similar al almacenamiento en caché del escáner HBase, que devuelve múltiples registros en una solicitud?
Sí, esa es Pipline. Introducción oficial http://redis.io/topics/pipelining
Cuando hay grandes lotes de operaciones a través de la tubería, podemos ahorrar mucho tiempo perdido en los retrasos en la red. Cabe señalar que los comandos están empaquetados y enviados usando tuberías. Redis debe almacenar en caché los resultados de procesamiento de todos los comandos antes de procesar todos los comandos. Cuantos más comandos empaces, más memoria consumirás. Por lo tanto, no es que cuanto más comandos empaquetados, mejor.
Cuando se usa Pipeline, el rendimiento se ha mejorado enormemente al leer y escribir Redis en lotes.
Java lo probó:
paquete com.lxw1234.redis; import java.util.hashmap; import java.util.map; import java.util.set; import Redis.clients.jedis.jedis; import Redis.clients.jedis.pipeline; import Redis.clients.jedis.Response; Public Class Test {public static static (string (string [string [string) redis = new JEdis ("127.0.0.1", 6379, 400000); Map <string, string> data = new HashMap <String, String> (); redis.select (8); redis.flushdb (); // hmset long start = System.CurrentTimemillis (); // hmset directo para (int i = 0; i <10000; 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 sin tubería usada [" + (finalizar - inicio) / 1000 + "] segundos .."); redis.select (8); redis.flushdb (); // Use la tubería HmSet Pipeline p = redis.pipelined (); start = System.CurrentTimemillis (); for (int i = 0; i <10000; i ++) {data.clear (); data.put ("k_" + i, "v_" + i); p.hmset ("key_" + i, datos); } p.sync (); end = System.CurrentTimemillis (); System.out.println ("dbsize: [" + redis.dbsize () + "] .."); System.out.println ("hmset con tubería utilizada [" + (finalización - inicio) / 1000 + "] segundos .."); // hmget set <string> keys = redis.keys ("*"); // use jedis hgetall start = system.currentTimemillis (); Map <string, map <string, string >> resultado = nuevo hashmap <string, map <string, string >> (); for (tecla de cadena: teclas) {resultado.put (key, redis.hgetall (key)); } end = System.CurrentTimemillis (); System.out.println ("Tamaño de resultado: [" + resultado.size () + "] .."); System.out.println ("hgetall sin tubería usado [" + (finalización - inicio) / 1000 + "] segundos .."); // Use Pipeline hgetall map <string, respuesta <map <string, string >>>> respuestas = new HashMap <String, respuesta <map <string, string >>> (keys.size ()); resultado.clear (); start = System.CurrentTimemillis (); for (clave de cadena: tecla) {respuestas.put (clave, p.hgetall (tecla)); } p.sync (); for (String K: Respuestas.KeySet ()) {result.put (k, respuestas.get (k) .get ()); } end = System.CurrentTimemillis (); System.out.println ("Tamaño de resultado: [" + resultado.size () + "] .."); System.out.println ("hgetall con la tubería utilizada [" + (finalizar - inicio) / 1000 + "] segundos .."); redis.disconnect (); }} Los resultados de la prueba son los siguientes:
dbsize: [10000] .. hmset sin tubería usada [243] segundos .. dbsize: [10000] .. hmset con tubería utilizada [0] segundos .. tamaño de resultado: [10000] .. hgetall sin tubería usada [243] segundos .. tamaño de resultado: [10000] .. hgetall con tubería usada [0] segundos ..
Usar tuberías para leer y escribir 10,000 registros en lotes es un pedazo de pastel y se hará en segundos.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.