场景描述

  • redis nodejs的api没有提供pop多个元素的指令

  • redis的smember函数没有办法移除要pop出去的元素,且高并发下可能存在问题

  • 使用 async.parallel来实现多个任务并列执行,最终可以一次性得到所有结果

  • 避免了nodejs异步编程中无法实现for循环+异步的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
}