gpt4 book ai didi

lua - 检查redis中的多个键

转载 作者:可可西里 更新时间:2023-11-01 11:13:02 25 4
gpt4 key购买 nike

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

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

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

在那种情况下,子组 2 将有空间,因此它应该返回 subgroup:2

如果没有任何空间,我希望它返回最后一个子组 +1。所以在那种情况下它会返回 subgroup:3

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

用户可以在加入后离开子组。我使用 multi 来执行此操作,但它似乎效率不高,因为即使在 key 中找到空间后它仍会继续运行 scard 。所以假设在这个例子中 user:2 离开了 subgroup:1,它仍然会检查 subgroup:2 看它是否有空间。

如果有办法让这项工作成功,我非常愿意重组数据。我唯一不想更改的是用户的 key 需要存储在子组集中。

如果有一种方法可以用 LUA 脚本做到这一点,我也愿意这样做。

我真的在寻找一种有效的方法来做到这一点。

有人可以帮忙吗?

最佳答案

Lua 脚本不是这里的方式 - 改写上述要求:我们正在寻找一种有效的方式来随时获取集合的基数(例如 subgroup:1),并且我们特别感兴趣的是成员最少的 Set(“有空间”)。

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

“当前”是指您的代码在子组上执行的每个 SADDSREMDEL 都需要与counts 键上的相关 ZADD

当您准备好所有这些后,您需要做的就是查询得分最低的成员的键:

ZRANGE counts 0 0

维护这个额外结构的成本是每当子组发生变化时更新的复杂性。 Sorted Sets 的操作通常是 O(log(N)),因此它们非常高效并且不会给服务器带来太多负担。

关于lua - 检查redis中的多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com