Итак… демо в прямом эфире, ух ты… 🙂 …
Зайдите на ipv.karate.monster и попробуйте. И да, не запускайте его на мобильном браузере chrome, сенсорные вещи не работают как надо. Кажется, работает на firefox mobile, но он никогда не разрабатывался для мобильных устройств, так что тут все зависит от ваших предпочтений, просто используйте компьютер 😉.
Как использовать? Нажмите кнопку с перекрестием, нажмите и перетащите на карту, чтобы сделать круг.
Визуализируйте материал, меняйте слои и настройки по своему усмотрению. В некоторых слоях можно нажать на нарисованные элементы, чтобы получить данные о них.
Давайте поговорим о массовой загрузке Redis.
Итак, для моего проекта мне нужно разобрать csv-файл и добавить данные в redis.
Поэтому сначала я просто разбирал csv-файл, запихивал promises с командами в массив, а затем регулярно отправлял его с помощью клиента node redis. Такой подход очень медленный, и я не рекомендую его использовать.
Мне нужен был способ получше, поэтому я начал гуглить и читать.
Наткнулся на репозиторий github, показывающий, как передавать команды из node в redis-cli.
Реализовал конвейер в своем коде, а также протокол, необходимый для массовой загрузки.
Ниже приведен код, возможно, он будет полезен кому-то, кто пытается сделать что-то подобное.
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 + 'rn'; //create start of message with amount of args
for (let i = 0; i < dataArr.length; i++) {
msg += '$' + dataArr[i].length + 'rn' + dataArr[i] + 'rn'; //encode the data
}
return msg; //return the encoded message
}
run();