Redis:奇怪的协议/网络错误

问题描述 投票:0回答:4

我正在运行 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 宝石

ruby-on-rails ruby network-programming redis
4个回答
2
投票

我有一个稍微类似的问题

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

结果是,我的 redis 服务器的连接超时设置为 300 秒。 5 分钟后,redis 终止了与我的工作人员的连接,他们正在记录上述错误。

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


1
投票

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


0
投票

初始化连接时,请确保传递

:thread_safe
选项:

Redis.connect(:thread_safe => true)

0
投票

资源暂时不可用 - 从套接字读取超时

我遇到了同样的问题,但使用的是 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 版本还应该允许控制超时。

© www.soinside.com 2019 - 2024. All rights reserved.