У нас есть redis db, которая ведет себя неправильно с точки зрения использования стандартных инструментов CLI для выгрузки / копирования данных. Так что мы просто скопируем это программно. У меня есть этот код прямо сейчас:
import * as Redis from 'ioredis';
import * as async from 'async';
export type EVCb<T = any, E = any> = (err?: E, val?: T) => void;
export type Task<T> = (cb: EVCb<T>) => void;
const redis = new Redis({
port: 6379,
db: 0
});
const redis2 = new Redis({
port: 6379,
db: 1
});
export const run = (cb: EVCb<void>) => {
const q = async.queue<Task<any>>((task, cb) => task(cb), 3);
let scanCount: number = -5000;
const getNext = () : number => {
return scanCount = scanCount + 5000;
};
const add = () => {
const scanCount = getNext();
q.push(async cb => {
try {
const [x, v] = await redis.scan(scanCount);
if(v.length < 1){
return cb(null);
}
add();
const d: Array<any> = await redis.mget(...v);
let i = 0;
const z = v.reduce((a,b) => (a.set(b, d[i++]), a), new Map());
await redis2.mset(z);
} catch (e) {
return cb(e);
}
cb(null);
}, err => {
if (err) {
console.error(err);
}
});
};
add();
add();
add();
q.drain(cb);
};
это не лучший код, но он должен работать. Кто-нибудь знает, есть ли более быстрый способ скопировать все ключи / значения из одной БД в другую? Кроме того, кто-нибудь знает, почему очередь asyn c никогда не сливается?