[REDIS] 클라이언트가 즉석에서 생성되는 매우 큰 파일을 다운로드하게하는 방법
REDIS클라이언트가 즉석에서 생성되는 매우 큰 파일을 다운로드하게하는 방법
나는 전체 데이터베이스를 읽고 모든 레코드와 .xls 파일을 만들 수출 기능을 가지고있다. 그런 다음 파일을 클라이언트로 전송됩니다.
물론, 수출의 시간은 전체 데이터베이스는 시간이 곧 시간 초과 오류로 종료됩니다 요청을 많이 필요로한다.
이 사건을 처리하는 가장 좋은 방법은 무엇입니까?
파일과 생성 된 파일을 다운로드 할 수있는 두 번째를 생성 작업을 시작하기위한 하나 나는 예를 들어 레디 스에 큐를 만드는하지만,이 두 가지 요청을 필요에 대해 뭔가를 들었습니다.
이 클라이언트에서 단일 요청을 할 수 있습니까?
해결법
-
==============================
1.엑셀 내보내기 :
엑셀 내보내기 :
사용 스트림. 다음은 할 수 무엇을 거친 아이디어 :
CSV 내보내기 :
하나의 테이블 / 수집 모듈 빠른 CSV의 CSV 내보내기에 사용할 수 있습니다 :
// response headers as usual res.status(200); res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv'); res.setHeader('Content-type', 'text/csv'); // create csv stream var csv = require('fast-csv'); var csvStr = csv.createWriteStream({headers: true}); // open database stream var dbStr = dbDriver.query('SELECT * from mytable').stream(); // connect the streams dbStr.pipe(csvStr).pipe(res);
당신은 지금 즉시 XLS / CSV 형식으로 변환, HTTP 응답 DB에서 데이터를 스트리밍하고 있습니다. 필요가 버퍼링하거나 메모리 나 파일의 전체 데이터를 저장합니다.
-
==============================
2.당신은 완료로 당신이 그것을 표시 마무리에서 바로 사용 res.write (덩어리) 및 res.end () (예를 들어 선으로 선)이 덩어리로 파일을 보낼 수 있으며, 한 번에 전체 파일을 보낼 필요가 없습니다.
당신은 완료로 당신이 그것을 표시 마무리에서 바로 사용 res.write (덩어리) 및 res.end () (예를 들어 선으로 선)이 덩어리로 파일을 보낼 수 있으며, 한 번에 전체 파일을 보낼 필요가 없습니다.
-
==============================
3.당신이 중 하나가 res.write (덩어리)를 통해 작성되는 각 개별 덩어리를 전송, 스트림으로 파일 정보를 보내거나, 덩어리하여 파일 청크를 보내는 옵션이없는 경우, 당신은 전체 파일을 기다릴 필요가 정보를 전송하기 전에, 당신은 항상 무한대 또는 파일이 생성 될 수 있도록 충분히 높은 것입니다 당신이 생각하는 값으로 시간 제한 기간을 설정하여 연결 개방을 유지할 수 있습니다. 다음 중 하나를 .xls 파일 등을 생성하는 기능을 설정합니다 :
당신이 중 하나가 res.write (덩어리)를 통해 작성되는 각 개별 덩어리를 전송, 스트림으로 파일 정보를 보내거나, 덩어리하여 파일 청크를 보내는 옵션이없는 경우, 당신은 전체 파일을 기다릴 필요가 정보를 전송하기 전에, 당신은 항상 무한대 또는 파일이 생성 될 수 있도록 충분히 높은 것입니다 당신이 생각하는 값으로 시간 제한 기간을 설정하여 연결 개방을 유지할 수 있습니다. 다음 중 하나를 .xls 파일 등을 생성하는 기능을 설정합니다 :
1) 준비 번 인수로 출력되는 데이터를 수신하는 콜백을 받아들이는 데이터를 전송하고 연결을 종료하거나;
2) 그 준비를 한 번 데이터 출력과 결의 당신이 해결 된 값과 바로 콜백 버전과 같은 가까운 연결을 보낼 수 있도록한다는 약속을 돌려줍니다.
그것은 다음과 같이 보일 것입니다 :
function xlsRouteHandler(req, res){ res.setTimeout(Infinity) || res.socket.setTimeout(Infinity) //callback version createXLSFile(...fileCreationArguments, function(finishedFile){ res.end(finishedFile) }) //promise version createXLSFile(...fileCreationArguments) .then(finishedFile => res.end(finishedFile)) }
당신은 아직도 자신이 시간 초과에 대해 우려 찾아내는 경우에, 당신은 항상 최종 파일 내용이 전송 될 준비가되면 서버 연결에 타임 아웃을 방지하고 그 간격을 취소 가끔 res.write () 메시지를 발송하는 간격 타이머를 설정할 수 있습니다 .
-
==============================
4.이 링크를 사용 jedis (레디 스 자바 클라이언트)를 참조하십시오 이 열쇠는 LPOPRPUSH 명령입니다
이 링크를 사용 jedis (레디 스 자바 클라이언트)를 참조하십시오 이 열쇠는 LPOPRPUSH 명령입니다
https://blog.logentries.com/2016/05/queuing-tasks-with-redis/
from https://stackoverflow.com/questions/43607411/how-to-make-the-client-download-a-very-large-file-that-is-genereted-on-the-fly by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 어떻게 레디 스 서버의 CPU 사용량을 개선하기 위해? (0) | 2020.01.15 |
---|---|
[REDIS] PooledRedisClientManager는 연결을 해제하지 (0) | 2020.01.15 |
[REDIS] 캐싱 JSON은 서버 측에서 객체 (0) | 2020.01.15 |
[REDIS] 레디 스 소트 세트의 부분 키 이름을 사용하여 값을 찾기 (0) | 2020.01.15 |
[REDIS] 푸른 레디 스 캐시의 최대 연결에 도달 (0) | 2020.01.15 |