2013-04-25 63 views
2

我在我的socket.io聊天應用程序的redis存儲中存儲用戶名/套接字ID對。如何從redis商店客戶端的鍵/值對中的值中獲取鍵值?

當用戶斷開連接時,我需要從redis存儲中刪除用戶名/套接字ID對。我已經看到如何從一個關鍵值獲取值,但從未從關鍵值獲取關鍵值。可能嗎?或者任何一種方式我如何才能從值中刪除鍵/值對。這裏是我的代碼

用於添加到存儲在連接

socket.on('username', function (username) { 

    client.set(username, socket.id, function (err) { 
     console.log(username + ":" + socket.id); 
    }); 

}); 

對於斷開,客戶不會知道什麼時候斷開會發生,可能發生由於網絡連接丟失,但是當插座斷開它總是打「斷開連接」事件。在這種情況下,我需要刪除用戶名/套接字ID對。

socket.on('disconnect', function() { 

// dont know the username?? 

    client.del(username, socket.id, function (err) { 
     if (err) 
      console.log(err); 
     else { 
      socket.disconnect(); 
      console.log(socket.id + " DISCONNECTED"); 
     } 
    }); 
}); 

回答

1

最簡單的方法是存儲雙。一個與username/id和一個與id/username。所以,無論你有什麼信息,你都可以獲得另一個關鍵/值對。

+0

謝謝,我確實繼續使用此解決方案。但我希望能有一個更直接的解決方案來解決這個問題。 – Bitsian 2013-04-30 06:03:27

+0

如果有索引(鍵)和數據(值)。沒有索引就無法搜索數據。或者你做一個「表掃描」。這是索引/數據的性質。 – heinob 2013-04-30 07:05:18

0

我建議您將socket.io Id合併到密鑰中,例如,

id:username 

然後,你可以做這樣的事情

client.keys([socket.id + ':*'], function (err, result) { 
    if (err){ 
     //handle in some way 
    } 

    for (var r in result) { 
     var key = result[r]; 

     client.del(key, function(err, result){ 
      // handle in some way 
     }); 
    } 
}); 
+0

我必須從用戶名中找到socketID。就像我在發送消息給其他用戶的時候一樣,那麼我會檢索給出用戶名的socket.id並將消息發送到該socketID。所以我絕對需要一種方法來從價值和其他方式中知道關鍵。 – Bitsian 2013-04-25 16:36:03

+0

在這種情況下,請從heinob中查看上面的答案並存儲兩個密鑰。我建議在斜槓上使用冒號更符合預期的Redis密鑰格式,儘管 – 2013-04-29 12:16:09