Вообще говоря, после того, как клиент Redis издает запрос, он обычно блокирует и ожидает обработки сервера Redis. После того, как сервер Redis завершит обработку, он вернет результат клиенту через сообщение ответа после запроса команды.
Такое ощущение, что это немного похоже на сканирование Hbase. Обычно клиент получает каждую запись и вызывает сервер сразу.
В Redis есть ли что -то похожее на кэширование сканера Hbase, которое возвращает несколько записей по одному запросу?
Да, это Pipline. Официальное введение http://redis.io/topics/pipelining
Когда через трубопровод существует большие партии операций, мы можем сэкономить много времени, потраченных на поток сети. Следует отметить, что команды упакованы и отправляются с использованием трубопровода. Redis должен кэшировать результаты обработки всех команд перед обработкой всех команд. Чем больше команд вы упаковываете, тем больше памяти вы потребляете. Так что это не так, чем более упакованные команды, тем лучше.
При использовании трубопровода производительность была значительно улучшена при чтении и написании Redis в партиях.
Java проверила это:
пакет com.lxw1234.redis; import java.util.hashmap; import java.util.map; import java.util.set; import redis.clients.jedis.jedis; импорт redis.clients.jedis.pipelin 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 (); // Direct HMSet для (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 без использования трубопровода [" + (end - start) / 1000 + "] секунд .."); Redis.select (8); redis.flushdb (); // Использование трубопровода HMSet Pipeline P = Redis.Pipelined (); 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 + "] секунд .."); // hmget set <string> keys = redis.keys ("*"); // Использование jedis hgetall start = system.currenttimemilsilis (); Map <string, map <string, string >> result = new hashmap <string, map <string, string >> (); for (String клавиша: keys) {result.put (key, redis.hgetall (key)); } end = System.CurrentTimeMillis (); System.out.println ("Размер результата: [" + result.size () + "] .."); System.out.println ("hgetall без использования трубопровода [" + (end - start) / 1000 + "] секунд .."); // Использование Pipeline Hgetall Map <String, ответ <map <string, string >>>> есты = new Hashmap <String, ответ <map <string, string >>> (keys.size ()); result.clear (); start = System.CurrentTimeMillis (); for (String Key: Keys) {response.put (key, p.hgetall (key)); } p.sync (); for (string k: response.keyset ()) {result.put (k, response.get (k) .get ()); } end = System.CurrentTimeMillis (); System.out.println ("Размер результата: [" + result.size () + "] .."); System.out.println ("hgetall с использованием трубопровода [" + (end - start) / 1000 + "] секунд .."); Redis.disconnect (); }} Результаты теста следующие:
DBSize: [10000] .. HMSet без использования трубопровода [243] секунд .. DBSIZE: [10000] .. HMSET с использованием трубопровода [0] секунд .. Размер результата: [10000] .. Hgetall без использования трубопровода [243] Секунды .. Размер результата: [10000] .. Hgetall с использованием трубопровода [0] секунд.
Использование трубопровода для чтения и написания 10 000 записей на партиях - это кусок торта, и это будет сделано за считанные секунды.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.