2

我一直在努力解决这个错误很长一段时间:

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 问题来看,该:thread_safe选项现在默认启用。我正在使用redis 2.2.2,因为redis 3.0.1与最新版本的resque.

在我的独角兽配置中,我Redis.current.quit在分叉后使用。

我还使用名为的 gem 连接到 Redis,ruote-redis它是工作流引擎 Ruote 的存储实现。

如何确保我的所有 Redis 连接都是稳定的,并且我不会再收到这个影响我们应用程序正常使用的错误?

4

1 回答 1

2

Unicorn 不是多线程的。您自己使用线程吗?

如文档中所述,您遇到的问题是多个 Unicorn 工作人员共享相同的连接(即相同的底层文件描述符)。

包含在 redis-rb 3.0 版本中的这一更改使其更加清晰。

如果您仍然遇到此错误,请发布您的 Unicorn 配置。

于 2012-06-19T02:00:25.557 回答