0

我正在尝试解决一个困扰我一个月的问题

我正在使用Node.js 和 Redis构建应用程序的后端,由于我们的结构,我们必须将数据从一个 redis 表传输到另一个表 (我的意思是是我们使用“select”的那个,即“select 2” )

我们在一秒钟内收到了很多请求并推送了很多响应,无论我尝试了多少,我都无法阻止数据混合。假设我们有一个必须存储在Redis 表 #2中的“teacherID”。还有一个必须存储在Redis 表 #4中的“studentID”。不管我尝试了什么(我已经多次检查了我的代码),我无法阻止teacherID 进入 studentID。我尝试的最后一个技巧实际上是在每个选择处放置回调。;

redisClient.select(4, function(err) {
  if(err)
    console.log("You could not select the table. Function will be aborted");
  else {
    // Proceed with the logic
  }
});

我不能简单地阻止这种混乱的原因是什么?让我抓狂的一个细节是,它在本地和在线上都非常有效,但是每当多个请求到达服务器时,它就会混合在一起。有什么建议可以防止此错误吗?(即使我无法将代码共享给 NDA,我也可以确保逻辑已正确编码)

4

1 回答 1

1

我不确定您关于必须“将数据从一个 redis 表传输到另一个表”的说法。通读您的示例,您似乎可以简单地拥有两个写入不同数据库(您称为“表”)的 redis 客户端。

它看起来类似于:

var redis = require("redis");
var client1 = redis.createClient(6379, '127.0.0.1');
var client2 = redis.createClient(6379, '127.0.0.1');

client1.select(2, function(err){
    console.log('client 1 is using database 2');
});

client2.select(4, function(err){
    console.log('client 2 is using database 4');
});

然后,无论您的读/写逻辑在哪里,您只需使用适当的客户端:

client1.set("someKey", "teacherID", function(err){
    // ...
});

client2.set("someKey", "studentID", function(err){
    // ...
});

您显然可以将上述内容封装到带有回调的函数中,嵌套操作,使用一些异步库等,以使其完成您需要做的任何事情。如果您需要将值从数据库 2 传输到数据库 4,您可以执行简单的client1.get()and client2.set().

于 2012-12-08T14:49:44.300 回答