2016-06-06 2 views
4

Я новичок в Redis и хочу знать, является ли хорошей практикой открывать клиентское соединение в течение всего времени работы моего приложения Java. Это соединение будет использоваться различными функциями.Redis одно соединение на всю жизнь приложения

Или альтернатива лучше: определение каждого соединения с методом, которое затем соединяет, устанавливает или получает данные и закрывает соединение в конце.

Какой из них является необходимым?

Спасибо.

Примечания: Я использую клиент lettuce Redis

+1

возможно c) весь пул соединений, которые остаются открытыми. Узкая область действия = много времени, потерянного во время установления соединения. – zapl

+0

@zapl. Ваш комментарий заставил меня найти интерфейс пула в библиотеке, которую я использую. Благодарю. Я бы принял ваш ответ, если вы разместите его. – sargas

ответ

4

Как и большинство подключений к серверам databaseish вы хотите сохранить открытые соединения. Повторное соединение занимает много времени и TCP-пакетов по сравнению с отправкой 1 пакета запросов и получением одного пакета ответа почти мгновенно назад.

Управление соединениями обычно осуществляется с помощью реализации пула. В случае салата docs state

салата обеспечивает пулы соединений для Redis Standalone и Redis Сентинел управляемых соединений. Хотя при использовании салата сборку не нужно, это может быть полезно для некоторых определенных сценариев. Соединения латуни рассчитаны на долговечность и автоматическое пересоединение. Несколько потоков могут использовать одно соединение одновременно.

В этом случае я бы не стал создавать пул. Redis является однопоточным в любом случае & Причина, по которой в других библиотеках, таких как jedis, вы хотите использовать пул, потому что их соединения не являются потокобезопасными.


Как автор салата указывает в комментариях, есть случаи, когда вы должны даже использовать несколько соединений. Кроме того, из той же документации связана выше:

Вы можете использовать блокирующие вызовы, такие как BLPOP, BRPOP, ... чтобы не блокировать все соединения. После того, как соединение блокируется с помощью блокирующего команды, он будет оставаться в этом состоянии до тех пор, Redis не реагирует с результатом

Эти команды не блокируют один поток REDIS', они ждут от определенных событий, чтобы случиться (например, элементов, получающих добавлен в список). Таким образом, вы можете & взаимодействовать с Redis в другом соединении. Не делать этого должно только замедлить вас - НО: Если вы единственный клиент, и вы планируете записывать данные, которые заставляют это событие зайти в тупик, если вы также хотите что-то прочитать перед письмом.

Вы используете сделки (MULTI/EXEC). Транзакции будут переключать ваше соединение в транзакционном состоянии. Другие потоки, которые разделяют соединение, будут непреднамеренно входить в транзакцию.

В этом случае вы в основном должны использовать несколько соединений, поскольку это влияет на правильность вашего кода. Вы вдруг получаете null значения, возвращаемые во время transactions, которые не означают, что значения не сохранено. И даже если вы не проверите возвращаемые значения, ваши изменения могут быть отменены без вашего уведомления.

+1

Согласитесь с ответом в целом, но использование пула зависит от вашего прецедента. Использование транзакций или операций блокировки является хорошей причиной для использования пула соединений. В любом другом случае объединение - это просто пустая трата ресурсов. соединения салата обеспечивают автоматическое повторное подключение, поэтому пользователи салата не будут видеть сломанные соединения (если только салат не настроен на отклонение команд на сломанных соединениях). – mp911de

1

Сохранение соединения redis является лучшим вариантом. Это также не создавало бы проблем для программы, которая функционирует асинхронно, если соединение остается открытым.