我正在编写一个算法,用于以最少的工作负荷推断用户。根据正在创建的任务的类型/复杂性,我缩小了能够执行它的用户列表。现在,我需要找到当前分配给他/她的任务编号最少的用户。 我使用redis排序集来存储成员/用户的分数,指示分配给他们的任务的数量。 有没有办法让一个成员得分最少的成员?
答案 0 :(得分:25)
成绩最低的成员:
ZRANGEBYSCORE myset -inf +inf WITHSCORES LIMIT 0 1
得分最高的会员:
ZREVRANGEBYSCORE myset +inf -inf WITHSCORES LIMIT 0 1
答案 1 :(得分:0)
希望,我理解你的排序集的结构:
members/users => score
所以你有一些不同的方法来解决你的问题。但是没有解决办法在一个redis命令上进行此操作。
使用ZSCORE
次调用捕获数据。 PHP与phpredis lib样本,O(N)复杂。
$subsetOfUsers = ['user1', 'user2'];
$multi = $redis->multi();
foreach ($subsetOfUsers as $user) {
$redis->zScore('yourKey', $user);
}
$result = $multi->exec();
使用ZINTERSTORE
。将您的成员子集添加到带有ZADD
和ZINTERSTORE
临时排序集的临时排序集的临时排序集中。接下来使用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))算法的复杂性。
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/zrange; https://redis.io/commands/zrevrange