在redis-py中使用SADD时避免超时/连接重置

时间:2019-02-09 15:57:34

标签: python redis redis-py

EDIT2

似乎一种解决方案是不立即插入整个集合,而如果集合很大,则对单个键使用多个sadd命令...因此,包含1M项的集合可能会插入到Redis中避免超时的100个块...还是很高兴知道是否存在一个超时参数,该参数允许在一次调用sadd ...

中插入整个集合

编辑

失败的最小示例

someints = list(range(2000000))
redis_client.sadd(2, *someints)

我必须增加什么超时参数才能解决该问题?

主要

redis version = 4.0.9(在本地主机上运行)

redis-py version = 3.1.0

python version = 3.6.8

我正在尝试使用redis-py将单个整数键与redis数据库中的整数集相关联。我有大约500万个整数键和许多整数集。最初,我使用redis-py管道来批处理sadd命令,但切换到每个键集对对sadd的一次调用以进行调试。  最大的集合大约有100万个整数,并且似乎总是会导致超时和/或连接重置错误。我尝试使用py-redis设置各种超时选项,但似乎无法避免超时/连接重置。我手动实现了一个try / except块,该块在失败时重试sadd命令,并且似乎可以运行一次(但是),但是我想知道是否有一些redis参数可以使工作完成吗?

密钥/集合对来自我反复遍历的psycopg2 DictCursor。我可以尝试先将它们全部拉入内存,以消除超时是由psycopg光标和redis之间的交互引起的可能性(但我认为这不是问题)。

for irow, row in enumerate(cursor):                                                                                                                              
  redis_client.sadd(row["nqid"], *row["nqids"]) 

我正在使用以下参数进行redis连接

redis_conn_dict = {
    ... host info ... 
    "socket_timeout": 3600,
    "socket_connect_timeout": 60,    
    "socket_keepalive": True,  
    "retry_on_timeout": True, 
}
redis_client = redis.Redis(**redis_conn_dict)

我看到的错误是这样的,

Traceback (most recent call last):
  File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/connection.py", line 599, in send_packed_command
    self._sock.sendall(item)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "links_to_redis.py", line 108, in <module>
    pg_schema, links_table, pg_conn_dict, redis_conn_dict, dryrun=clargs.dryrun
  File "links_to_redis.py", line 44, in insert_table_into_redis
    redis_client.sadd(row["nqid"], *row["nqids"])
  File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/client.py", line 1878, in sadd
    return self.execute_command('SADD', name, *values)
  File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/client.py", line 774, in execute_command
    connection.send_command(*args)
  File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/connection.py", line 619, in send_command
    self.send_packed_command(self.pack_command(*args))
  File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/connection.py", line 612, in send_packed_command
    (errno, errmsg))
redis.exceptions.ConnectionError: Error 104 while writing to socket. Connection reset by peer.

0 个答案:

没有答案