D'une manière générale, après que le client redis ait publié une demande, il bloque et attend généralement le traitement du serveur Redis. Une fois le serveur Redis terminé le traitement, il renverra le résultat au client via le message de réponse après avoir demandé la commande.
Il semble que ce soit un peu similaire au scan de HBase. Habituellement, le client obtient chaque enregistrement et appelle le serveur à la fois.
Dans Redis, y a-t-il quelque chose de similaire à la mise en cache du scanner HBASE, qui renvoie plusieurs enregistrements à une demande?
Oui, c'est Pipline. Introduction officielle http://redis.io/topics/pipelining
Lorsqu'il y a de grands lots d'opérations via le pipeline, nous pouvons économiser beaucoup de temps perdu sur les retards de réseau. Il convient de noter que les commandes sont emballées et envoyées à l'aide du pipeline. Redis doit mettre en cache les résultats de traitement de toutes les commandes avant de traiter toutes les commandes. Plus vous emballez de commandes, plus vous consommez de mémoire. Ce n'est donc pas que les commandes les plus emballées, mieux c'est.
Lors de l'utilisation du pipeline, les performances ont été considérablement améliorées lors de la lecture et de l'écriture de Redis par lots.
Java l'a testé:
Package com.lxw1234.redis; importer 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; Jeded Classe {STATIC STATIC STATIC VOID Main (String [] args) THORSE exception {JEDIS {STATIC STATICAL VOID Main (String [] Args) THORS EXCEPTION {exception publique {STATIC STATIC STATIQUE MAINE (STRANG 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 direct pour (int i = 0; i <10000; i ++) {data.clear (); data.put ("k_" + i, "v_" + i); redis.hmset ("key_" + i, data); } long fin = System.currentTimemillis (); System.out.println ("DBSIZE: [" + redis.dbSize () + "] .."); System.out.println ("hmset sans pipeline utilisé [" + (end - start) / 1000 + "] secondes .."); redis.Select (8); redis.flushdb (); // Utiliser le pipeline Hmset Pipeline P = redis.pipelined (); start = System.currentTimemillis (); pour (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 avec pipeline utilisé [" + (end - start) / 1000 + "] secondes .."); // hmget set <string> keys = redis.keys ("*"); // Utilisez Jedis hgetall start = System.currentTimeMillis (); Map <string, map <string, string >> result = new hashmap <string, map <string, string >> (); for (string key: keys) {result.put (key, redis.hgetall (key)); } end = System.currenttimemillis (); System.out.println ("Taille du résultat: [" + résultat.size () + "] .."); System.out.println ("HGGETALL sans pipeline utilisé [" + (end - start) / 1000 + "] secondes .."); // Utilisez le pipeline HGGETALL MAP <String, Response <Map <String, String >>>> Réponses = new HashMap <String, Response <Map <String, String >>> (Keys.Size ()); result.clear (); start = System.currentTimemillis (); for (String Key: Keys) {réponses.put (key, p.hGetall (key)); } p.Sync (); for (String k: réponses.KeySet ()) {result.put (k, réponses.get (k) .get ()); } end = System.currenttimemillis (); System.out.println ("Taille du résultat: [" + résultat.size () + "] .."); System.out.println ("HGGETALL avec pipeline utilisé [" + (end - start) / 1000 + "] secondes .."); redis.disconnect (); }} Les résultats des tests sont les suivants:
DBSIZE: [10000] .. HMSET sans pipeline utilisé [243] secondes .. DBSIZE: [10000] .. HMSET avec pipeline utilisé [0] secondes .. Taille du résultat: [10000] .. HGETALL sans pipeline utilisé [243] secondes .. Taille du résultat: [10000] .. HGETALL avec pipeline utilisé [0] secondes ..
L'utilisation du pipeline pour lire et écrire 10 000 enregistrements par lots est un morceau de gâteau et cela se fera en quelques secondes.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.