2015-03-27 4 views
7

Я использую клиент Jedis для подключения к моему серверу Redis. Ниже приведены параметры, я использую для подключения Jedis (используя апачский общий пул):Настройки подключения jedis для высокой производительности и надежности

JedisPoolConfig poolConfig = new JedisPoolConfig(); 
poolConfig.setTestOnBorrow(true); 
poolConfig.setTestOnReturn(true); 
poolConfig.setMaxIdle(400); 

// Tests whether connections are dead during idle periods 
poolConfig.setTestWhileIdle(true); 
poolConfig.setMaxTotal(400); 

// configuring it for some good max value so that timeout don't occur 
poolConfig.setMaxWaitMillis(120000); 

До сих пор с ними настройки я не предъявляются какие-либо проблемы с точки зрения надежности (я всегда могу получить Jedis когда я хочу), но я вижу некоторое отставание от работы Джедайса.

Может ли кто-нибудь предложить мне еще одну оптимизацию для достижения высокой производительности?

+0

Какая часть вас интересует? Могут быть сетевые обратные вызовы, которые можно опускать, если вы используете конвейерные или lua-скрипты. Redis довольно быстро, так что не должно быть. Определен ли ваш пул множеством экземпляров jedis? Если слишком много компонентов запрашивают синтаксически для экземпляра jedis, он будет блокировать задачи, поскольку для всех ресурсов недостаточно. Вы можете это проверить? – zenbeni

ответ

13

Вы имеете 3 испытания сконфигурированные:

  • TestOnBorrow - Посылает запрос PING, когда вы просите ресурса.
  • TestOnReturn - отправляет PING, и вы возвращаете ресурс в пул.
  • TestWhileIdle - отправляет периодические PINGS из незанятых ресурсов в пуле.

Хотя хорошо знать, что ваши соединения все еще живы, те запросы onBorrow PING тратят RTT перед вашим запросом, а два других теста тратят впустую ценные ресурсы Redis. Теоретически, соединение может ухудшиться даже после теста PING, поэтому вы должны поймать исключение соединения в своем коде и разобраться с ним, даже если вы отправляете PING. Если ваша сеть стабильна и у вас слишком мало капель, вы должны удалить эти тесты и обработать этот сценарий только в своих исключениях исключения.

Кроме того, установив MaxIdle == MaxTotal, вы не выселите ресурсы из вашего пула (хорошие/плохие?, Зависит от вашего использования). И когда ваш пул исчерпан, попытка получить ресурс завершится таймаутом через 2 минуты ожидания свободного ресурса.

+0

Спасибо Ofir за ответ на мой вопрос. Я сохранил все эти проверки, чтобы всегда получать ресурс в обязательном порядке. Но, похоже, это также заставляет меня замедлиться для некоторых запросов Jedis get/set. Я понял ваши первые три использования параметров, но все же сомневаюсь в использовании «max Idle» и «maxTotal». скажем, я сохраняю 100 ресурсов как «max Total» и 50 как max idle, я получу только 50 активных подключений, или я получу 100 активных соединений с этими настройками? – pjain

+0

Также хотелось знать, как пул джедаев управляет своими соединениями? Скажем, если я установил 100 в качестве активных подключений, будет ли он поддерживать все 100 активных подключений автоматически (для срока службы приложения), или мне нужно повторно подключиться для какого-либо ресурса, если один из них сломается (если jedis.getResource() возвращает исключение для этих соединений)? – pjain

+0

«Также, установив MaxIdle == MaxTotal, вы не выселите ресурсы из вашего пула (хорошие/плохие?, Зависит от вашего использования).« Неверно, я думаю. Даже если вы установите maxidle == MaxTotal, вы будете выселены, если вы установите timeBetweenEvictionRunsMillis()> 0. –

Смежные вопросы