1

我正在运行 Redis 并使用 ezmobius 的 Redis gem[1] 从 Ruby 进行连接。

定期(大约每天一次)我在我的 Rails 应用程序中遇到一系列异常,这些异常是由 Redis 返回奇怪的结果引起的。

它们通常由以下异常触发:

Redis::ProtocolError: Protocol error, got '3' as initial reply byte                         

或者

Redis::ProtocolError: Protocol error, got '9' as initial reply byte                      

或者有时

Errno::EAGAIN: Resource temporarily unavailable - Timeout reading from the socket

通常需要重新启动我的 Rails 服务器才能解决连接问题。我正在运行 Fedora Core 8、Rails 2.3.8、Redis gem 2.0.3。我已经安装了 system_timer gem。有人知道如何阻止这些错误吗?

[1] Redis 宝石

4

3 回答 3

1

我刚刚在后台工作人员中注意到了同样的事情,它们将任务存储在 Redis 的队列中,并通过 Redis pub/sub 进行通信。Google 结果表明,如果您从多个线程中使用相同的 Redis 对象,可能会发生这种情况......我不确定我的应用程序是否属于这种情况,我将不得不对此进行调查(但我确实有线程)。

于 2010-12-13T15:19:59.853 回答
1

我有一个稍微相似的问题

Errno::EAGAIN: Resource temporarily unavailable - Timeout reading from the socket

事实证明,我的 redis-server 的连接超时设置为 300 秒。5 分钟后,redis 正在终止与我的工作人员的连接,他们正在记录上面的错误。

如果您的套接字超时每 x 秒发生一次,那么毫无疑问,redis 会杀死您的“空闲”连接!

于 2010-12-21T11:26:16.613 回答
0

初始化连接时,请确保传递:thread_safe选项:

Redis.connect(:thread_safe => true)
于 2010-12-20T15:08:54.147 回答