我一直在努力解决这个错误:
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.
在使用Unicorn和Redis的应用程序中间歇性地发生这种情况。从redis-rb Github issue开始,默认情况下,:thread_safe
选项现已启用。我使用的是redis 2.2.2
,因为redis 3.0.1
与最新版本的resque
不兼容。
在我的Unicorn配置中,我在fork之后使用Redis.current.quit
。
我还使用名为ruote-redis
的gem连接到Redis,这是工作流引擎Ruote的存储实现。
如何确保我的所有Redis连接都稳定,并且我不会再出现此错误,这会破坏我们应用的正常使用?
答案 0 :(得分:2)
Unicorn不是多线程的。你自己在使用线程吗?
正如文档中所述,您遇到的问题是多个Unicorn工作者共享相同的连接(即相同的底层文件描述符)。
This change,包含在版本redis-rb 3.0中,使其更加清晰。
如果您仍然遇到此错误,请发布您的Unicorn配置。