完成几乎所有任务后,Redis数据库会出现“连接被拒绝”错误

时间:2014-05-11 22:41:36

标签: redis

我试图解析我存储在redis数据库中的一些数据(在我的本地计算机上,通过默认端口6739访问)。本质上,任务是迭代数据库中的大约10K哈希结构,从当前哈希值中的字段计算新字段,然后将该新字段写回数据库,这样我就不需要进行计算试。

我的脚本启动正常,连接到数据库,并在使用" redis.exceptions.ConnectionError:连接localhost:6379的错误111崩溃之前通过大约9500个哈希值。连接被拒绝。"错误。我重新启动了EC2实例,我多次运行它并且每次都在同一个地方崩溃。

知道可能会发生什么吗?为什么redis可以用于某些数据集然后崩溃?

编辑:这是执行的输出。它在死前大约需要3分半钟。

$ sudo python parser.py 
Added 0 out of 10378 to dictionary: 22:48:53
Added 100 out of 10378 to dictionary: 22:48:54
Added 200 out of 10378 to dictionary: 22:48:55
Added 300 out of 10378 to dictionary: 22:48:57
Added 400 out of 10378 to dictionary: 22:48:58
Added 500 out of 10378 to dictionary: 22:49:00
...
Added 9000 out of 10378 to dictionary: 22:51:16
Added 9100 out of 10378 to dictionary: 22:51:30
Added 9200 out of 10378 to dictionary: 22:51:44
Added 9300 out of 10378 to dictionary: 22:52:00
Added 9400 out of 10378 to dictionary: 22:52:15
Added 9500 out of 10378 to dictionary: 22:52:17
Traceback (most recent call last):
  File "parser.py", line 180, in <module>
   buildDictionary(force=True)
  File "parser.py", line 123, in buildDictionary
   addPostToDict(postid)
  File "parser.py", line 92, in addPostToDict
    comments = [contentFromId(commentid) for commentid in commentids]
  File "parser.py", line 72, in contentFromId
    content = db.hget(contentid, keyword)
  File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 1539, in hget
    return self.execute_command('HGET', name, key)
  File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 464, in execute_command
    connection.send_command(*args)
  File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 334, in send_command
    self.send_packed_command(self.pack_command(*args))
  File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 316, in send_packed_command
    self.connect()
  File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 253, in connect
    raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 111 connecting localhost:6379. Connection refused.

2 个答案:

答案 0 :(得分:0)

您可以在Redis中设置超时和内存限制,以确保它能够处理长时间的连接和超时

答案 1 :(得分:0)

所以答案结果是我的Redis数据库对于我的小EC2实例的内存来说太大了。正如Itamar在评论中指出的那样,Redis将所有内容存储在内存中。一旦我的作业向数据库添加了太多项目并填满了所有可用内存,Redis就拒绝了所有进一步添加到数据库的请求。

我观察到的可能有助于您诊断的事情:

  1. 以后的工作开始时间越来越长(你可以在编辑中看到开头每100个工作需要1-2秒,但最后每100个工作需要15秒)
  2. 我降低了我的Redis商店可以使用的最大内存量,并且它开始失败了