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.