问题背景
同时在redis多个数据库中同时写入数据,有的数据未写入,有的数据写入到了别的数据库
原因
redis是用c语言实现的,同时select数据库的时候会出现指针错乱问题,由于redis跑任务时候是多线程的,所以当同时select时,select0号数据库写入的时候,指针指向0号数据库,但未完成写入操作时,别的select数据库线程覆盖了。导致指针指向了1号数据库,导致写入0号数据库的key-value到了1号数据库,从而导致错乱
解决方法(promise)
对于这种问题,为了保证指针不错乱,就要求异步执行,当操作1结束之后再进行操作2,在node.js中可通过promise实现解决
- 用promise封装操作,当操作完成才resolve(只举例一个)
function handleCloudData(db, data) {
return new Promise((resolve, reject) => {
client.select(db, () => {
client.set("wordCloudData", JSON.stringify(wordCloudData), (err) => {
if (err) {
reject();
} else {
resolve();
}
});
});
})
}
- 用async/await来实现异步
function handleSalaryData(db) {
return new Promise(
(resolve, reject) => {
let salaryData = { list: [[], [], []] };
async function tmp() {
await handleSalaryByMajor("dm").then(res => {
//dosth
});
await handleSalaryByMajor("cs").then(res => {
//dosth
});
await handleSalaryByMajor("em").then(res => {
//dosth
});
}
tmp();
}
);
}