Redis Ошибка сломанной трубы
Мы пытаемся УСТАНОВИТЬ маринованный объект размером 2,3 ГБ в redis через пакет redis-py. Обнаружена следующая ошибка.
BrokenPipeError: [Errno 32] сломанная труба
redis.exceptions.ConnectionError: Ошибка 104 при записи в сокет. Сброс соединения по пиру.
Я хотел бы понять причину. Это связано с ограничением буфера ввода / вывода на стороне сервера или на стороне клиента? Это связано с какими-либо ограничениями протокола RESP? Разрешено ли хранить в Redis одно значение (в байтах) 2,3 Гб?
импорт редис
r = redis.StrictRedis(host='10.XXX ', port = 7000, db = 0)
pickled_object = pickle.dumps (obj_to_be_pickled)
r.set ('some_key', pickled_object)
Ошибка на стороне клиента
BrokenPipeError: [Errno 32] сломанная труба
/usr/local/lib/python3.4/site-packages/redis/connection.py (544) send_packed_command ()
self._sock.sendall (пункт)
Ошибка на стороне сервера
31164:M 04 Apr 06:02:42.334 - Ошибка протокола от клиента: id=95 addr=10.2.130.144:36120 fd=11 name= age=0 бездействующих = 0 флагов =N db=0 sub=0 psub=0 multi=-1 qbuf=16384 qbuf-free=16384 obl=42 долларов = 0 ом = 0 событий =r cmd=NULL
31164: M 04 Apr 06: 07: 09.591 - Ошибка протокола от клиента: id=96 addr=10.2.130.144:36139 fd=11 name= age=9 бездействующих = 0 флагов =N db=0 sub=0 psub=0 multi=-1 qbuf=40 qbuf-free=32728 obl=42 oll=0 omem=0 событий =r cmd=NULL
Версия Redis: 3.2.8 / 64 бит
2 ответа
Проблема в том, что размер данных передается в Redis. Команда отправляется в Redis, поскольку два элемента соответствуют стандартам RESP
№ 1
b'*3\r\n$3\r\nSET\r\n$8\r\nsome_key\r\n$2460086692\r\n'
Where
*3 - indicates RESP array of three elements
\r\n - indicates the RESP Carriage return Line Feeder(separator)
$3 - indicates Bulk string of length 3 bytes(here it is 'SET')
$8 - indicates Bulk String of length 8 bytes(he it is 'some_key')
$2460086692 - indicates Bulk String of length 2460086692 bytes (the length of value 2460 MB to be passed to Redis as next item )
пункт № 2
b'\x80\x03csklearn.ensemble.forest\nRandomForestC...
Here item #2 indicates the actual data
- В момент передачи инструкции № 1 серверу Redis сервер закрыл соединение, так как значение $2460086692 нарушило правило протокола 512 МБ.
- Когда элемент № 2 отправляется на сервер Redis, мы получили исключение Broken Pipe, так как сервер уже закрыл соединение.