在redis中检查多个键

时间:2017-05-16 14:00:16

标签: lua redis

以下是我在redis中设置的键的示例:

$validators

所以我想要实现的是我想找出哪个子组在键SADD group:test subgroup:1 SADD subgroup:1 user:1 SADD subgroup:1 user:2 SADD group:test subgroup:2 SADD subgroup:2 user:3 中有空格并返回它。例如,假设每个子组的最大用户数为2。

在这种情况下,子组2将有空格,因此它应该返回group:test

如果没有任何空间,我希望它返回最后一个子组+1。因此,在这种情况下,它将返回subgroup:2

目前,编写此方式意味着我必须使用subgroup:3来获取smembers集的成员并使用group:test遍历每个密钥以查看哪个子组具有空间。如果循环结束且任何键中没有空格,那么我只需将1添加到最后一个子组并使用它。

用户可以在加入后离开子组。我用multi来做这件事,但它看起来效率不高,因为即使它在一个键中找到了空格,它仍继续运行scard。所以,让我们在这个示例scarduser:2中说,它仍然会检查subgroup:1是否有空格。

如果能够实现这项工作,我非常愿意重新构建数据。我唯一不想改变的是用户的密钥需要存储在子组集中。

如果有办法使用LUA脚本,我也愿意这样做。

我真的在寻找一种有效的方法。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

Lua脚本不是这里的方式 - 重写上述要求:我们正在寻找一种有效的方法来获取集合的基数(例如subgroup:1),我们和&# #39;特别感兴趣的是设置成员最少的人("有空格")。

为此,您在数据库中保留另一个密钥 - 让我们调用它counts。该键包含一个Sorted Set数据结构,其中每个元素都是您的一个集合的名称,而得分是其当前基数。

通过&#34;当前&#34;我的意思是,您的代码在子组上执行的每个SADDSREMDEL都需要与ZADD密钥上的相关counts结合使用。< / p>

当你拥有所有这些时,你需要做的就是查询得分最低的成员的关键词:

ZRANGE counts 0 0

维护这种额外结构的成本是子组更改时更新的复杂性。分类集&#39;操作通常是O(log(N)),因此它们非常有效,并且不会给服务器带来太多负担。