1. 程式人生 > >nodejs下利用parallel從redis中pop多個數據

nodejs下利用parallel從redis中pop多個數據

場景描述

  • 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; }