当前位置: 首页 > 面试题库 >

如何在Redis的ZRANK中获得相同分数的相同排名?

太叔志文
2023-03-14
问题内容

如果我有5位成员的得分如下

a - 1
b - 2
c - 3
d - 3
e - 5

c的ZRANK返回2,d的ZRANK返回3

对于相同的分数,是否可以获得相同的排名?
示例:ZRANK c = 2,d = 2,e = 3
如果是,那么如何在spring-data-redis中实现呢?


问题答案:

任何实际的解决方案都需要满足要求,这是原始问题中所缺少的。我的第一个答案假设数据集很小,但是这种方法无法扩展,因为至少在O(N)中完成了密集排序(例如,通过Lua)。

因此,假设有很多具有分数的用户,for_stack建议的方向会更好,在该方向上可以合并多个数据结构。我相信这是他最后一句话的要旨。

要存储用户的分数,您可以使用哈希。从概念上讲,您可以使用一个键来存储所有用户分数的哈希值,但实际上,您希望对哈希值进行哈希处理,以便进行扩展。为了使此示例简单,我将忽略哈希缩放。

这是您在Lua中添加(更新)用户分数的方式:

local hscores_key = KEYS[1]
local user = ARGV[1]
local increment = ARGV[2]
local new_score = redis.call('HINCRBY', hscores_key, user, increment)

接下来,我们要跟踪每个离散得分值的当前用户数,因此我们为此保留另一个哈希值:

local old_score = new_score - increment
local hcounts_key = KEYS[2]
local old_count = redis.call('HINCRBY', hcounts_key, old_score, -1)
local new_count = redis.call('HINCRBY', hcounts_key, new_score, 1)

现在,我们需要维护的最后一件事是按分数排序并带有排序集。每个新分数都将添加为zset中的成员,并删除没有更多用户的分数:

local zdranks_key = KEYS[3]
if new_count == 1 then
  redis.call('ZADD', zdranks_key, new_score, new_score)
end
if old_count == 0 then
  redis.call('ZREM', zdranks_key, old_score)
end

由于使用了排序集,此三段脚本的复杂度为O(logN),但请注意,N是离散分数值的数量,而不是系统中的用户。通过另一个更短,更简单的脚本来获取用户的密集排名:

local hscores_key = KEYS[1]
local zdranks_key = KEYS[2]
local user = ARGV[1]

local score = redis.call('HGET', hscores_key, user)
return redis.call('ZRANK', zdranks_key, score)


 类似资料:
  • 因此,我正在创建一个用户API,并尝试在登录前调用getUserByEmail()。我的问题是,我得到了一个不明确的处理程序方法映射为HTTP路径错误。 我知道我的问题与我有一个相同但参数类型不同的GET有关。任何帮助都将不胜感激!

  • 我已经使用登录API在Jmeter中进行了测试。 为此,我通过了以下请求: 帖子网址:......POST数据参数:"电子邮件地址":"a@gmail.com","密码":"ad332017" 对于上述要求,我得到两种不同的答复。 邮递员:我收到回复,状态代码200 OK(这也是预期的) 在Jmeter上,我得到响应:响应代码:307响应消息:临时重定向。 谁能帮我解决这个问题?

  • 问题内容: 我开始使用Jenkins声明式管道。现在,我希望具有与Mailer插件的用法中所定义的相同的电子邮件通知行为: 每个失败的构建都会触发一封新电子邮件。 失败(或不稳定)的构建之后的成功构建会触发一封新电子邮件,表明危机已经结束。 成功构建后不稳定的构建会触发新电子邮件,表明存在回归。 除非进行配置,否则每个不稳定的构建都会触发一封新电子邮件,表明回归仍然存在。 我阅读了有关管道中的通知

  • 我必须使用google places api实现餐厅定位服务,如下所示: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=43.7666321,11.2546258 但结果与使用谷歌地图进行的近距离搜索大不相同: https://www.google.it/maps/search/Ristoranti/@4

  • 我试图让发送消息给另一方的用户和接收消息的用户在每行的一行中。 那么oracle sql查询应该是什么呢

  • 我试图在两个图上绘制熊猫数据帧。一个是matplotlib pyplot饼图,另一个是seaborn条形图。在每个图表上,我根据不同的列对数据框进行排序。此外,每个图表都代表数据框排序所依据的相应值。因此,两个图表中的行顺序不同。这样,数据框中相同的索引(或类别)在图表上以不同的颜色出现,这是令人困惑的。为了在不同的图表上有相同颜色的索引,我如何解决这个问题? 我的代码: 例如,1.1。15200