2012-12-08 34 views
0

我試圖解決已經封鎖了我一個月Redis的:在錯誤的表

我使用bulding的Node.js的的Redis與和應用的後端問題,由於我們的結構數據錯誤我們必須從一個Redis的表數據傳輸至另一(我的意思是什麼是我們用「選擇」了一個人,即「選擇2」)

我們收到了大量的請求,並推在一秒內有很多回應,而且無論我嘗試了多少I cou ld不停止數據混合。假設我們有一個「teacherID」,它必須存儲在Redis表#2裏面。並且「studentID」必須存儲在Redis表#4中。如何重要我試過(我已經多次查看我的代碼)我無法停止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,但我可以確保邏輯已被正確編碼)

+1

每個redisclient實例只應綁定到一個數據庫。否則另一個並行選擇可能會改變數據庫,然後你的回調改變執行 –

+0

我的猜測是你在回調的異步性質上犯了一個錯誤。我發現很多錯誤,例如,兩個異步調用發生更改並使用相同的變量,這會導致意外的行爲。沒有看到實際的代碼,很難說。您是否可以通過允許分享的某些代碼最小程度地重現問題? – mtsr

回答

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()client2.set()