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