Подтвердить что ты не робот

Как вы * правильно * запросите Redis от Tornado?

Мне любопытно, какой рекомендуемый метод запроса Redis (или любой другой DB) относится к Tornado.

Я видел несколько примеров, таких как https://gist.github.com/357306, но все они, похоже, используют блокирующие вызовы для redis.

Мое понимание заключается в том, что, чтобы не прерывать торнадо, мне нужно использовать неблокирующие библиотеки БД, подобные тем, которые были разработаны для Twisted.

Неужели я ошибаюсь? Как это должно быть сделано?

4b9b3361

Ответ 1

Когда дело доходит до блокировки команд, таких как BLPOP или прослушивания канала Pub/Sub, вам понадобится асинхронный клиент, например tornado-redis. Вы можете начать с этой демонстрации, чтобы увидеть, как клиент tornado-redis может быть использован для разработки простое общедоступное приложение чата.

Но я бы рекомендовал использовать синхронный redis-py клиент в сочетании с hiredis для большинства других случаев.

Основное преимущество асинхронного клиента заключается в том, что ваш сервер может обрабатывать входящие запросы, ожидая ответа сервера Redis. Однако сервер Redis настолько быстр, что в большинстве случаев накладные расходы на установку асинхронных обратных вызовов в вашем приложении Tornado добавляет больше общего времени обработки запроса, а затем времени, затраченного на ожидание ответа сервера Redis.

Используя асинхронный клиент, вы можете одновременно отправить несколько запросов на сервер Redis, но сервер Redis является однопоточным (как и сервер Tornado), поэтому он будет отвечать на эти запросы один за другим -не и вы почти ничего не получите. И на самом деле вам не нужно отправлять несколько команд Redis одновременно на один и тот же сервер Redis, если есть конвейеры и команды типа MGET/MSET.

Асинхронный клиент имеет некоторые преимущества при использовании нескольких экземпляров сервера Redis, но я предлагаю использовать синхронный (redis-py) клиент и прокси, например twemproxy. или этот (последний поддерживает команды конвейеризации и MGET/MSET).

Также я предлагаю не использовать пул соединений при использовании клиента redis-py в приложениях Tornado. Просто создайте единственный экземпляр объекта Redis для каждой базы данных Redis, к которой ваше приложение подключается.

Ответ 2

Я бы рекомендовал использовать brukva, который является "асинхронным клиентом Redis, который работает в цикле IO Tornado".

Ответ 3

Один из вариантов - использовать порт Tornado to Twisted, а затем использовать API Twisted Redis. Сам Tornado, похоже, не имеет произвольных асинхронных операций как цель (хотя, если вы хотите перестроить все те вещи, которые были созданы для Twisted, вы, возможно, могли строить их из низкоуровневые API-интерфейсы iostream в Tornado, но я бы не рекомендовал его).