Почему я должен закрыть или оставить соединения Redis открытыми?

Я использую Redis в проекте PHP. Я использую phpredis в качестве клиента. Иногда, во время длинных CLI-скриптов, я испытываю ошибки сегментации PHP.

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

Чтобы иметь возможность выбрать, следует ли увеличить время ожидания соединения или установить по умолчанию его значение 0 (что означает "никогда не превышать время ожидания"), я хотел бы знать, каковы возможные преимущества и недостатки?

Почему я никогда не должен закрывать соединение?
Почему я должен убедиться, что соединения не остаются открытыми?

Спасибо

2 ответа

Как правило, открытие соединения является дорогостоящей операцией, поэтому современные лучшие практики должны держать их открытыми. С другой стороны, открытые соединения требуют ресурсов (из базы данных) для управления, поэтому сохранение большого количества свободных соединений также может быть проблематичным. Этот компромисс обычно разрешается с помощью пулов соединений.

Тем не менее, что более интересно, почему PHP Segfault. Тайм-аут, очевидно, вызван длительной командой (сценарий CLI в вашем случае), которая блокирует Redis (который в основном однопоточный) от посещения соединений приложения PHP. Хотя это общеизвестное поведение Redis, я бы ожидал, что PHP (событие, в котором не используется функция повторного подключения в клиентской библиотеке) не будет так жалко себя чувствовать.

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

Как правило, нет, вы должны оставить его по умолчанию - 0. Почему или когда:

  • Любые виды долгоживущих приложений. Например, CLI-скрипт от фонового рабочего. Почему - phpredis не имеет встроенной функции переподключения, поэтому вы должны позаботиться об этом самостоятельно или не использовать время простоя.
  • Каждый раз, когда ваш запрос обрабатывается или скрипт CLI умирает - все соединения будут закрыты движком php. Сервер Redis закрывает все соединения для закрытых клиентских сокетов. У вас не будет таких проблем, как связь с зомби или что-то подобное. В качестве расширения phpredis закрывает соединение в деструкторе - так что вы можете быть уверены, что соединения не остаются открытыми.

ps Конечно, вы можете самостоятельно реализовать прокси-класс insome прокси в php. У нас есть redis в среде с высокой нагрузкой - ~4000 соединений в секунду, например. После версии 2.4 мы не используем время ожидания простоя. И никаких проблем с этим не возникает.

Другие вопросы по тегам