Lua 在redis中检查多个键
下面是我在redis中设置的关键点的示例:Lua 在redis中检查多个键,lua,redis,Lua,Redis,下面是我在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 所以我想实现的是,我想找出哪个子组在keygroup:test中有空格,然后返回它。例如,假设每个子组的最大用户数为2 在这种情况下,子组2将有空间,因此它应该返回subgroup:2 如果没有任何空格,我希
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
所以我想实现的是,我想找出哪个子组在keygroup:test
中有空格,然后返回它。例如,假设每个子组的最大用户数为2
在这种情况下,子组2将有空间,因此它应该返回subgroup:2
如果没有任何空格,我希望它返回最后一个子组+1。因此,在这种情况下,它将返回subgroup:3
目前,这种编写方式意味着我必须使用smembers
获取组的成员:测试设置并使用scard
循环每个键,以查看哪个子组有空间。如果循环结束,并且任何键中都没有空格,那么我只需在最后一个子组中添加1并使用它
用户可以在加入子组后离开。我使用multi来实现这一点,但它似乎不是很有效,因为即使在钥匙中找到空间后,它仍会继续运行scard。因此,让我们假设在这个示例中,user:2
leftsubgroup:1
,它仍然会检查subgroup:2
以查看它是否有空间
如果有办法的话,我非常愿意重组数据。我唯一不想更改的是,用户的密钥需要存储在子组集中
如果有一种方法可以用LUA脚本实现这一点,我也愿意这么做
我真的在寻找一种有效的方法来做到这一点
有人能帮上忙吗?Lua脚本不是这里的方式-重写上述要求:我们正在寻找一种有效的方法来随时获取集合的基数(例如子组:1
),我们特别感兴趣的是集合中成员最少的那个(“有空间”)
要做到这一点,您需要在数据库中保留另一个键—我们称之为计数。该键保存一个排序集数据结构,其中每个元素是一个集合的名称,分数是当前的基数
“当前”是指代码对子组执行的每个SADD
、SREM
和DEL
,都需要与计数
键上的相关ZADD
耦合
当所有这些都准备就绪后,只需查询得分最低的成员的密钥:
ZRANGE counts 0 0
维护这个额外结构的成本是每当子组发生变化时更新的复杂性。排序集的操作通常是O(log(N)),因此它们非常有效,不会给服务器带来太多负担。这里不是Lua脚本的方式-改写上述要求:我们正在寻找一种有效的方式,随时获取集的基数(例如子组:1
),我们特别感兴趣的是设置成员最少的一个(“有空间”)
要做到这一点,您需要在数据库中保留另一个键—我们称之为计数。该键保存一个排序集数据结构,其中每个元素是一个集合的名称,分数是当前的基数
“当前”是指代码对子组执行的每个SADD
、SREM
和DEL
,都需要与计数
键上的相关ZADD
耦合
当所有这些都准备就绪后,只需查询得分最低的成员的密钥:
ZRANGE counts 0 0
维护这个额外结构的成本是每当子组发生变化时更新的复杂性。排序集的操作通常是O(log(N)),因此它们非常有效,不会给服务器带来太多负担。对不起,我在解释这个问题时犯了一个错误。我确实使用SCARD来查看哪个子组有空间。我编辑它是为了让它更清楚。对不起,我在解释这个问题时犯了一个错误。我确实使用SCARD来查看哪个子组有空间。我对它进行了编辑,使它更清晰。