使用redis排序集维护顶级用户的上限列表(按分数)

使用redis排序集维护顶级用户的上限列表(按分数),redis,Redis,我想在我正在做的python项目中维护一个前100名用户(按分数)的列表。我觉得redis排序集对于上述目的来说是一个很好的工具 然而,我不想为每个曾经得分的用户维护记录。这将是一个相当大的排序集,我只想按总分排名前100名 在redis的范围内,是否有方法使用排序集来实现这一点 我知道在列表的情况下可以执行lpush和ltrim,但这是一种更简单的情况,不需要按分数排序。那么我该怎么做呢 我知道这个问题也可以在redis排序集领域之外得到回答,但redis排序集是一个很好的工具,因此,使用它们

我想在我正在做的python项目中维护一个前100名用户(按分数)的列表。我觉得redis
排序集
对于上述目的来说是一个很好的工具

然而,我不想为每个曾经得分的用户维护记录。这将是一个相当大的
排序集
,我只想按总分排名前100名

在redis的范围内,是否有方法使用排序集来实现这一点

我知道在列表的情况下可以执行
lpush
ltrim
,但这是一种更简单的情况,不需要按
分数排序。那么我该怎么做呢

我知道这个问题也可以在redis
排序集
领域之外得到回答,但redis
排序集
是一个很好的工具,因此,使用它们演示示例答案对于我试图实现的目标来说是非常好的


提前谢谢

您可以这样做,但需要一些设置才能正确管理前100名排序集


算法解释见(参见第1个算法)。不久前,我将其作为一个Redis模块(topk-)实现,但它也应该是可行的,无需借助模块API。

您可以这样做,但需要进行一些设置,以便正确管理排名前100位的排序集


算法解释见(参见第1个算法)。我不久前已经将其作为Redis模块(topk-)实现了,但它也应该可以在不使用模块API的情况下实现。

Top-K是RedisBloom中的一种全新数据类型。 它有一个简单的命令集,非常精简。在一些基准测试中,它比排序集所需的速度快五倍,占用的内存不到1%。 你可以了解它


Redis发布了一个关于Top-K的解决方案。

Top-K是RedisBloom中的一种全新数据类型。 它有一个简单的命令集,非常精简。在一些基准测试中,它比排序集所需的速度快五倍,占用的内存不到1%。 你可以了解它


Redis发布了一个关于Top-K的解决方案。

你所说的“聚合分数”是什么意思?用户的分数可能会改变吗?例如,在时间点1,用户的分数是
5
,在时间点2,用户获得另一个分数
3
。因此,用户的总分更改为
5+3=8
?@for_stack:是的,这就是问题所在。这是一个不断变化的数字。在这种情况下,如果你想得到一个准确的结果,你必须为所有用户保存分数。如果你能容忍一些错误,你可以接受@Itamar的答案。你所说的“总分”是什么意思?用户的分数可能会改变吗?例如,在时间点1,用户的分数是
5
,在时间点2,用户获得另一个分数
3
。因此,用户的总分更改为
5+3=8
?@for_stack:是的,这就是问题所在。这是一个不断变化的数字。在这种情况下,如果你想得到一个准确的结果,你必须为所有用户保存分数。如果你能容忍一些错误,你可以接受@Itamar的答案。谢谢Itamar。我试图弄清楚您的实现和共享的Berkeley PDF是否有任何质的区别。似乎PDF中的第一个算法建议在有新候选项要添加时,如果其基数溢出,则减少集合中的所有计数器(但保留候选项未添加)。当集合基数溢出时,您的实现将递减所有计数器,然后始终添加候选项。我看得对吗?我忘了我在那里做了什么,但IIRC它只是一个优化-有一个全局计数器,我增加而不是所有分数。它被编码在zsets“first”(0分?)元素中。
Count Min Sketch
是一个聪明的算法。内存效率和不准确结果之间的权衡:)@for_stack:我觉得Itamar指的是1.1(确定性)而不是1.2(计数最小草图)?CMS也是一个很酷的东西——另一个无耻的插件:谢谢Itamar。我试图弄清楚您的实现和共享的Berkeley PDF是否有任何质的区别。似乎PDF中的第一个算法建议在有新候选项要添加时,如果其基数溢出,则减少集合中的所有计数器(但保留候选项未添加)。当集合基数溢出时,您的实现将递减所有计数器,然后始终添加候选项。我看得对吗?我忘了我在那里做了什么,但IIRC它只是一个优化-有一个全局计数器,我增加而不是所有分数。它被编码在zsets“first”(0分?)元素中。
Count Min Sketch
是一个聪明的算法。内存效率和不准确结果之间的权衡:)@for_stack:我觉得Itamar指的是1.1(确定性)而不是1.2(计数最小草图)?CMS也是一个很酷的东西,另一个无耻的插头: