IP Visualizer 라이브 데모 및 redis 대량 로드 노드.

Soo.. 데모가 라이브, woohoo.. 🙂
ipv.karate.monster으로 이동하여 사용해 보십시오. 그리고 네, 크롬 모바일 브라우저에서 실행하지 마세요. 터치 기능이 이상하고 정상적으로 작동하지 않습니다. 파이어폭스 모바일에서 작동하는 것 같지만, 모바일용으로 실제로 개발된 적이 없으므로 마일리지가 다양합니다. 컴퓨터를 사용하세요 😉.

사용하는 방법? 십자선 버튼을 누르고 지도를 클릭하고 드래그하여 원을 만듭니다.
원하는 대로 물건을 시각화하고 레이어와 설정을 변경합니다. 일부 레이어에서는 그려진 항목을 클릭하여 데이터를 가져올 수 있습니다.

Redis 대량 로드에 대해 이야기해 봅시다.
그래서 내 프로젝트를 위해 csv 파일을 구문 분석하고 redis에 데이터를 추가해야 합니다.

그래서 처음에는 csv 파일을 구문 분석하고 명령으로 약속을 배열로 삽질한 다음 노드 redis 클라이언트와 함께 정기적으로 보냈습니다. 이 접근 방식은 slooooow이며 권장하지 않습니다.

더 나은 방법이 필요해서 인터넷 검색을 시작하고 읽기 시작했습니다.
노드에서 redis-cli로 명령을 파이프하는 방법을 보여주는 a github repository을 우연히 발견했습니다.

내 코드와 또한 파이프라인을 구현했습니다the protocol needed for bulkloading.

아래는 코드입니다. 비슷한 작업을 시도하는 사람에게 유용할 수 있습니다.

const spawn = require('child_process').spawn;
const fs = require('fs');
const CsvReadableStream = require('csv-reader');
const redisPipe = spawn('redis-cli', ['--pipe']);

redisPipe.stdout.setEncoding('utf8');
redisPipe.stdout.pipe(process.stdout);
redisPipe.stderr.pipe(process.stderr);

const file = 'my.csv';
const BUFFER_SIZE = 524288; // 512KB
let buffer = '';

async function run() {
    let inputStream = fs.createReadStream(file, 'utf8');
    console.log('Let the piping commence!');

    inputStream
        .pipe(new CsvReadableStream({ asObject: true })) //reads in every row of file as object with keys being taken from csv header
        .on('data', async function (row) {
            //check that the row acutally have coordinates, if not i dont want it
            if (row.longitude && row.latitude) {
                //encode the string with the redis command and add it to the buffer
                buffer += encodeRedis(`geoadd ips ${row.longitude} ${row.latitude} "${row.network}"`);

                //when buffer is filled then write it and then empty buffer.
                if (buffer.length > BUFFER_SIZE) {
                    redisPipe.stdin.write(buffer);
                    buffer = '';
                }
            }
        })
        .on('end', async function () {
            redisPipe.stdin.write(buffer); //write the remaining buffer if any left
            redisPipe.stdin.end(); //end the pipe
            console.log('Update complete');
            process.exit();
        });
}

function encodeRedis(dataString) {
    const dataArr = dataString.split(' '); //split data into array
    let msg = '*' + dataArr.length + '\r\n'; //create start of message with amount of args

    for (let i = 0; i < dataArr.length; i++) {
        msg += '$' + dataArr[i].length + '\r\n' + dataArr[i] + '\r\n'; //encode the data
    }
    return msg; //return the encoded message
}

run();

좋은 웹페이지 즐겨찾기