我正在运行 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 宝石
我有一个稍微类似的问题
Errno::EAGAIN: Resource temporarily unavailable - Timeout reading from the socket
结果是,我的 redis 服务器的连接超时设置为 300 秒。 5 分钟后,redis 终止了与我的工作人员的连接,他们正在记录上述错误。
如果你的套接字超时每 x 秒发生一次,那么毫无疑问,redis 会杀死你的“空闲”连接!
我刚刚在我的后台工作人员中注意到同样的事情,它们将任务存储在 Redis 的队列中,并通过 Redis 发布/订阅进行通信。 Google 结果表明,如果您从多个线程使用相同的 Redis 对象,则可能会发生这种情况...我不确定我的应用程序中是否存在这种情况,我必须对此进行调查(但我确实有线程) ).
初始化连接时,请确保传递
:thread_safe
选项:
Redis.connect(:thread_safe => true)
资源暂时不可用 - 从套接字读取超时
我遇到了同样的问题,但使用的是 C++ 版本的 Redis 客户端。我试图在获取 ~100 个键时重用来自 16 个不同线程的一个连接。
就我而言,它有助于增加参数socket_timeout和connect_timeout。
sw::redis::ConnectionOptions opt;
opt.host = host;
opt.port = port;
opt.socket_timeout = REDIS_SOCKET_TIMEOUT;
opt.connect_timeout = REDIS_CONNECTION_TIMEOUT;
https://github.com/sewenew/redis-plus-plus/issues/604
Redis 客户端库的 Ruby 版本还应该允许控制超时。