redis select 插入出错

初学redis,写了个小demo,预想目标:db0-db9每个插入一条数据,现实情况是全部都插入到db9了,请帮忙看下,谢谢。

app.js提供服务:

var express = require("express");
var bodyParser = require('body-parser');

var redis = require("redis");
var client = redis.createClient("6379","192.168.205.161");

var app = express();
app.use(bodyParser());

app.post("/",function(req,res){
    client.SELECT(req.body.id,function(){
        client.HMSET(req.body.id,req.body,function(err){
            if(err){
                console.log("插入失败");
                return false;
            }
            console.log("插入成功");
            client.EXPIRE(req.body.id,86400);
        });
    })
});

app.listen("3001");

利用request模块模拟post请求

var request = require("request");

for(var i = 0;i<10;i++){
    (function(i){
        request.post({
            url:'http://127.0.0.1:3001/',
            json:{'id':i}
        });
    })(i);
}

图片描述

阅读 3.5k
2 个回答

试试

var request = require("request");

for(let i = 0;i<10;i++){
    (function(i){
        request.post({
            url:'http://127.0.0.1:3001/',
            json:{'id':i}
        });
    })(i);
}

node 和 redis 的关系是异步的, 第一次select的回调触发时,redis都已经将10条命令执行完了。 redis最后执行的是 select(9), 所以第一次到第十次的set操作都写进 db9了.
使用 Pipelining 或者 Transaction 都行。
用法看文档吧,https://github.com/luin/ioredis

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题