我很好奇,推薦的Redis查詢方法(或任何數據庫)來自Tornado。如何正確*從Tornado查詢Redis?
我見過一些例子像https://gist.github.com/357306但他們都似乎使用的是阻塞調用Redis的。
我的理解是,要避免磨旋風停了下來,我需要使用非阻塞DB庫像扭曲發展的人。
我錯了嗎?這應該怎麼做?
我很好奇,推薦的Redis查詢方法(或任何數據庫)來自Tornado。如何正確*從Tornado查詢Redis?
我見過一些例子像https://gist.github.com/357306但他們都似乎使用的是阻塞調用Redis的。
我的理解是,要避免磨旋風停了下來,我需要使用非阻塞DB庫像扭曲發展的人。
我錯了嗎?這應該怎麼做?
當涉及到像BLPOP那樣的阻塞命令或者監聽Pub/Sub通道時,您需要一個異步客戶端,如tornado-redis。您可以從this demo開始,瞭解tornado-redis客戶端如何用於開發簡單的公共聊天應用程序。
但我會建議使用結合同步redis-py客戶端hiredis大多數其他案件。
異步客戶端的主要優點是,您的服務器可以處理傳入的請求,同時等待Redis的服務器響應。但是,Redis服務器速度如此之快,以至於在大多數情況下,在您的Tornado應用程序中設置異步回調的開銷會增加請求處理的總時間,然後增加等待Redis服務器響應的時間。
使用異步客戶端可以嘗試同時向Redis服務器發送多個請求,但Redis服務器是一個單線程服務器(就像Tornado服務器一樣),因此它將一次性響應這些請求,你會得到幾乎沒有。事實上,只要存在管道和命令(如MGET/MSET),則不必同時向相同的Redis服務器發送多個Redis命令。我建議使用同步(redis-py)客戶端和twemproxy或this one(後者支持管道傳輸和MGET/MSET命令)等代理服務器。
另外,我建議在使用Redis-py客戶端的Tornado應用程序時不要使用連接池。只需爲您的應用程序連接到的每個Redis數據庫創建一個單一的Redis
對象實例。
一種選擇是使用port of Tornado to Twisted,然後使用the Twisted Redis API這一點。龍捲風本身似乎並不具有任意異步操作作爲一個目標(但如果你想重建所有已建成的扭曲各種各樣的事情,你可能會從建立the low-level iostream APIs in Tornado他們,但I wouldn't recommend it)。
或者在Tornado之上的扭曲反應堆實現:http://tornado.readthedocs.org/en/latest/twisted.html – 2015-07-04 09:36:55
我會建議使用brukva這是一個「異步Redis的客戶龍捲風IO環路內的作品」。
爲防萬一誰在這篇文章中發現了錯誤,我認爲最新的異步redis庫現在是tornadoredis https://github.com/leporo/tornado-redis – 2012-06-27 17:27:47
事實上,使用同步客戶端對於普通情況聽起來沒問題,但最糟糕的情況可能不會被接受!示例1:如果Redis掛起或網絡到Redis速度較慢,則會掛起您的Tornado應用程序。示例2:在客戶機上序列化請求並在服務器上進行序列化僅在網絡延遲爲0的情況下才是等效的,這幾乎從不是這種情況。 – 2014-05-26 17:54:55
龍捲風不再被維護。但存儲庫提供了一些替代方法:https://github.com/aio-libs/aioredis和https://github.com/mrjoes/toredis – matyas 2018-03-02 19:51:31