以下是我在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。所以,让我们在这个示例scard
左user:2
中说,它仍然会检查subgroup:1
是否有空格。
如果能够实现这项工作,我非常愿意重新构建数据。我唯一不想改变的是用户的密钥需要存储在子组集中。
如果有办法使用LUA脚本,我也愿意这样做。
我真的在寻找一种有效的方法。
任何人都可以帮忙吗?
答案 0 :(得分:2)
Lua脚本不是这里的方式 - 重写上述要求:我们正在寻找一种有效的方法来获取集合的基数(例如subgroup:1
),我们和&# #39;特别感兴趣的是设置成员最少的人("有空格")。
为此,您在数据库中保留另一个密钥 - 让我们调用它counts
。该键包含一个Sorted Set数据结构,其中每个元素都是您的一个集合的名称,而得分是其当前基数。
通过"当前"我的意思是,您的代码在子组上执行的每个SADD
,SREM
和DEL
都需要与ZADD
密钥上的相关counts
结合使用。< / p>
当你拥有所有这些时,你需要做的就是查询得分最低的成员的关键词:
ZRANGE counts 0 0
维护这种额外结构的成本是子组更改时更新的复杂性。分类集&#39;操作通常是O(log(N)),因此它们非常有效,并且不会给服务器带来太多负担。