2012-06-07 84 views
2

我一直是這樣的錯誤掙扎了很長一段時間:Redis的連接在多線程環境(獨角獸)

Redis::ProtocolError: Got 'i' as initial reply byte. 
If you're running in a multi-threaded environment, make sure you pass the :thread_safe 
option when initializing the connection. If you're in a forking environment, such as 
Unicorn, you need to connect to Redis after forking. 

它間歇發生在使用獨角獸和Redis的應用程序。從這redis-rb Github issue它看起來:thread_safe選項現在默認啓用。我正在使用redis 2.2.2,因爲redis 3.0.1與最新版本的resque不兼容。

在我的獨角獸配置中,我在分叉之後使用了Redis.current.quit

我還使用名爲ruote-redis的gem連接到Redis,這是一個工作流引擎Ruote的存儲實現。

如何確保我所有的Redis連接都穩定,並且不會再出現這個錯誤,這會影響我們應用的正常使用?

回答

2

獨角獸不是多線程的。你自己在使用線程嗎?

如文檔中所述,您遇到的問題是多個獨角獸工作人員共享相同的連接(即相同的基礎文件描述符)。

This change,包含在版本redis-rb 3.0中,使其更加清晰。

如果您仍然遇到此錯誤,請發佈您的獨角獸配置。

+0

我沒有使用線程。我很樂意使用redis-rb 3.0,但resque與它不兼容。我將'ruote-redis'寶石換成了'ruote-mon',它使用Mongo進行存儲。這似乎解決了這個問題。 –