如何从redis中获取密钥并通过检查其值来删除其他密钥?

时间:2014-05-23 10:10:30

标签: node.js redis

我想保留两个系列。

  
      
  1. 实时或活动服务器。 Say集合包含SERVER1,SERVER2。
  2.   
  3. 连接到特定服务器的客户端c1,c2,c3表示SERVER1,客户端c4,c5,c6连接到SERVER2其他集合将   有,
  4.   
**KEY : VALUE**
    c1:SERVER1
    c3:SERVER1
    c4:SERVER2
    c6:SERVER2
    c2:SERVER1
    c5:SERVER2

我将从馆藏中移除的非活动服务器。

每当我从redis中删除服务器(比如SERVER1)时,我想删除其值与之匹配的实例。在这里,我想完全删除c1,c2,c3。然后收集将是这样的:

**KEY : VALUE**
    c4:SERVER2
    c6:SERVER2
    c5:SERVER2

要维护集合,我可以使用哪种类型的redis命令。像集/列表一样。? 我怎样才能达到这个结果。?

2 个答案:

答案 0 :(得分:0)

您的要求是1.通过检查客户端ID来搜索客户端连接的服务器; 2.删除服务器时,删除该服务器上的所有客户端。

我认为您可以通过redis hash存储client->服务器映射,并使用redis set存储SERVER [x]

的客户端

使用sadd将客户端添加到服务器

使用del完全删除服务器及其客户端的密钥

此外,使用redis管道确保原子性。

例如:

将客户端C添加到服务器[i]:

client.multi()
    .sadd("SERVER" + i, 'C')
    .hset('CLIENT_TO_SERVER', 'C', "SERVER" + i)
    .exec(function (err, replies) {
        console.log(replies)
    });

删除服务器[i]:

client.watch("SERVER" + i);
multi = client.multi();
client.smembers("SERVER" + i, function(err, replies) {
    var keys = Object.keys(replies)
    keys.forEach(function(i) {
        multi.hdel('CLIENT_TO_SERVER', keys[i])
    }
});
multi.del("SERVER"+i);
multi.exec(function(err,replies) {
    console.log(replies)
});

您可以使用keys('SERVER*')获取第一个集合中的所有成员

答案 1 :(得分:0)

对于主列表,您可以使用SET key val命令存储它们,也可以将它们存储在HSET(或HMSET)的专用哈希表中。后者将为您提供有效使用此表的选项(特别是如果您的数据库中存储了大量密钥)。

您还希望为每个服务器保留SET个已连接的客户端。 删除服务器时,从主哈希表中删除所有服务器集成员,并在完成后删除该集。

对于你的例子:

   HMSET connectedClients c1 SERVER1 c2 SERVER1 c3 SERVER1 c4 SERVER2 c5 SERVER2 c6 SERVER2
   SADD SERVER1Clients c1 c2 c3
   SADD SERVER2Clients c4 c5 c6 

删除服务器时,您可以使用所有连接的客户端 SMEMBERS SERVERxClients,并从哈希中删除输出列表 HDEL connectedClients <Output of SMEMBERS>

指向所有hashset命令文档的链接