我想保留两个系列。
- 实时或活动服务器。 Say集合包含SERVER1,SERVER2。
- 连接到特定服务器的客户端c1,c2,c3表示SERVER1,客户端c4,c5,c6连接到SERVER2其他集合将 有,
醇>
**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命令。像集/列表一样。? 我怎样才能达到这个结果。?
答案 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>