Избегайте тайм-аута / сброса соединения при использовании SADD в Redis-Py - PullRequest
0 голосов
/ 09 февраля 2019

РЕДАКТИРОВАТЬ2

Кажется, одно решение состоит в том, чтобы не вставлять весь набор сразу, а использовать несколько команд sadd для одной клавиши, если набор большой ... такнабор с 1М элементов может быть вставлен в redis за 100 порций, чтобы избежать тайм-аута ... все же было бы неплохо узнать, есть ли параметр тайм-аута, который позволял бы вставлять весь набор в один вызов sadd ...

РЕДАКТИРОВАТЬ

Минимальный пример сбоя

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

Какой параметр тайм-аута мне нужно увеличить, чтобы это исправить?

MAIN

redis version = 4.0.9 (работает на локальном хосте)

redis-py version = 3.1.0

python version = 3.6.8

Я пытаюсь связать одно целочисленные ключи с целочисленными наборами в базе данных redis, используя redis-py.У меня около 5 миллионов целочисленных ключей и столько же целых наборов.Сначала я использовал конвейер redis-py для пакетирования команд sadd, но переключился на один вызов sadd для каждой пары набор ключей для отладки.Самый большой набор имеет около 1 миллиона целых чисел и всегда вызывает ошибку тайм-аута и / или сброса соединения.Я попытался установить различные параметры времени ожидания, используя py-redis, но, похоже, не могу избежать тайм-аута / сброса соединения.Я вручную реализовал блок try / исключением, который повторяет команду 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.
...