nodejs下利用parallel從redis中pop多個數據
阿新 • • 發佈:2019-01-23
場景描述
redis nodejs的api沒有提供pop多個元素的指令
redis的smember函式沒有辦法移除要pop出去的元素,且高併發下可能存在問題
使用 async.parallel來實現多個任務並列執行,最終可以一次性得到所有結果
避免了nodejs非同步程式設計中無法實現
for迴圈+非同步的問題
router.post('/pictures_list', function (req, res, next) {
var app_id = req.body.app_id; # 獲取redis的key
client.scard(app_id, function (error, data) {
if (error) {
res.setHeader('Content-Type', 'text/json');
res.json(JSON.stringify({'url': datas}))
} else {
//得到redis中appid對應的Set集合中的元素數量,將其全部pop出來
var tasks = create_task(data, app_id);
// 建立num個pop任務,將num個任務parallel執行,result中的結果是
//num個pop任務得到的結果
async.parallel(tasks, function (error, result) {
res.setHeader('Content-Type', 'text/json');
res.json(JSON.stringify({'url': result}));
});
}
});
});
/**
* count是要pop出來的數量
* app_id是redis的Set的key
*/
function create_task(count, app_id) {
var tasks = [];
for (var i = 0; i < count; i++) {
tasks[i] = function (num) {
return function (callback) {
client.spop(app_id, function (error, datas) {
callback(null, datas);
});
}
}(i);
}
return tasks;
}