Как вы * правильно * запрашиваете Redis из Tornado? - PullRequest
20 голосов
/ 10 мая 2011

Мне любопытно, какой рекомендуемый метод запроса Redis (или любой другой БД в этом отношении) от Tornado.

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

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

неправильно?Как это должно быть сделано?

Ответы [ 3 ]

40 голосов
/ 24 марта 2013

Когда речь идет о блокировании таких команд, как 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, к которой подключается ваше приложение.

8 голосов
/ 11 мая 2011

Я бы порекомендовал использовать brukva , который является «Асинхронным клиентом Redis, работающим в цикле ввода-вывода Tornado».

1 голос
/ 10 мая 2011

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

...