如何在给定成员子集的情况下从redis排序集中获得具有最大(或最小)分数的成员?

时间:2013-11-16 10:19:08

标签: redis sortedset

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

3 个答案:

答案 0 :(得分:25)

成绩最低的成员:

ZRANGEBYSCORE myset -inf +inf WITHSCORES LIMIT 0 1

得分最高的会员:

ZREVRANGEBYSCORE myset +inf -inf WITHSCORES LIMIT 0 1

答案 1 :(得分:0)

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

members/users => score

所以你有一些不同的方法来解决你的问题。但是没有解决办法在一个redis命令上进行此操作。

  1. 使用ZSCORE次调用捕获数据。 PHP与phpredis lib样本,O(N)复杂。

    $subsetOfUsers = ['user1', 'user2'];
    $multi = $redis->multi(); 
    foreach ($subsetOfUsers as $user) {
       $redis->zScore('yourKey', $user);
    }
    $result = $multi->exec();
    
  2. 使用ZINTERSTORE。将您的成员子集添加到带有ZADDZINTERSTORE临时排序集的临时排序集的临时排序集中。接下来使用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))算法的复杂性。

  3. P.S。如果您使用redis> = 2.6,您可以编写LUA存储过程来优化两个给定的样本。

答案 2 :(得分:0)

得分最低的排序元素:
ZRANGE key 0 0 WITHSCORES

得分最高的排序元素:
ZREVRANGE key 0 0 WITHSCORES

  

时间复杂度:O(log(N)+ M),其中N为元素中的元素数量   排序后的集合,M表示返回的元素数。

文档https://redis.io/commands/zrangehttps://redis.io/commands/zrevrange