如何从给定成员子集的redis排序集中获得得分最高(或最低)的成员?

如何从给定成员子集的redis排序集中获得得分最高(或最低)的成员?,redis,sortedset,Redis,Sortedset,我正在编写一个算法,用于推断工作量最少的用户。根据所创建任务的类型/复杂性,我缩小了能够执行任务的用户列表。现在,我需要找到当前分配给他/她任务最少的用户。 我使用redis排序集来存储成员/用户的分数,该分数表示分配给他们的任务数量。 有没有办法在给定成员子集的情况下获得得分最低的成员?希望,我了解排序集的结构: members/users => score 所以你有一些不同的方法来解决你的问题。但是没有解决方案可以在一个redis命令上实现这一点 使用ZSCORE调用集捕获数据。带有

我正在编写一个算法,用于推断工作量最少的用户。根据所创建任务的类型/复杂性,我缩小了能够执行任务的用户列表。现在,我需要找到当前分配给他/她任务最少的用户。 我使用redis排序集来存储成员/用户的分数,该分数表示分配给他们的任务数量。
有没有办法在给定成员子集的情况下获得得分最低的成员?

希望,我了解排序集的结构:

members/users => score
所以你有一些不同的方法来解决你的问题。但是没有解决方案可以在一个redis命令上实现这一点

  • 使用
    ZSCORE
    调用集捕获数据。带有phpredis lib的PHP示例,具有O(N)复杂性

    $subsetOfUsers = ['user1', 'user2'];
    $multi = $redis->multi(); 
    foreach ($subsetOfUsers as $user) {
       $redis->zScore('yourKey', $user);
    }
    $result = $multi->exec();
    
  • 使用。使用
    ZADD
    ZINTERSTORE
    temp排序集将成员子集添加到临时排序集。接下来使用
    ZRANGE
    获取结果。这可以通过
    MULTI
    执行

    ADD tmp 0 "user1"
    ADD tmp 0 "user2"
    ZINTERSTORE out 2 tmp yourDataSortedSetKey
    ZRANGE out 0 -1 WITHSCORES
    
    这是一种清晰的“redis方式”,算法复杂度为O(N*K)+O(M*log(M))

  • $subsetOfUsers = ['user1', 'user2'];
    $multi = $redis->multi(); 
    foreach ($subsetOfUsers as $user) {
       $redis->zScore('yourKey', $user);
    }
    $result = $multi->exec();
    

    p、 如果您使用的是redis>=2.6,则可以编写LUA存储过程来优化两个给定样本。

    最低分数的成员:

    ZRANGEBYSCORE myset -inf +inf WITHSCORES LIMIT 0 1
    
    ZREVRANGEBYSCORE myset +inf -inf WITHSCORES LIMIT 0 1
    
    得分最高的会员:

    ZRANGEBYSCORE myset -inf +inf WITHSCORES LIMIT 0 1
    
    ZREVRANGEBYSCORE myset +inf -inf WITHSCORES LIMIT 0 1
    

    得分最低的已排序集合元素:
    ZRANGE键0 0带核心


    得分最高的已排序集合元素:
    ZREVRANGE键0带核心

    时间复杂度:O(log(N)+M),其中N是 排序后的集合和M返回的元素数


    文档:

    这些操作的时间复杂度是多少?文档中说O(log(N)+M),限制是否会懒散地进行评估以提供更好的性能?它是
    O(log(N))
    ,因此对于10亿个条目来说,为完整性增加大约20个比较:
    ZREVRANGE 0 0 WTHSCORES
    为最高分数,而
    ZRANGE 0 0 with cores
    为最低分数