Dav*_*d G 2 sorting optimization lua sortedset redis
我想使用redis'排序集作为排行榜.但是使用ZREVRANGE 0 x
,我只能从得分中得到最高的x(基于得分的升序排序集的结尾),使用默认的tie tie,来自官方redis文档:
字典顺序用于具有相同分数的元素.
我需要的领带破坏者是分数输入的日期时间.
例如
submits (in order) redis sorts it as I need
User1 -- Score 50 User1 User1
User3 -- Score 40 User2 User3
User2 -- Score 40 User3 User2
Run Code Online (Sandbox Code Playgroud)
我看到的唯一解决方案是在条目上存储上次更新的日期时间,但仍然用于ZREVRANGE key 0 x
从前x个用户获取最大和最小分数.然后做一个ZREVRANGEBYSCORE key max min
.如果结果长度高于x,则至少存在一个平局,因此我将使用2个键在Lua中对该较小的列表进行排序.
这种方法看起来非常慢,我需要让它适用于成千上万的用户.我不喜欢2个调用和Lua处理(在redis方面,保持原子)并且想知道是否有更好的方法来使用2个键来排序集合或配置另一个绑定器?
我的代码已经写好了,所以我不能改变我的数据库类型.如果你有任何有趣的想法,我很想听听他们,因为我不是redis的专家.
有序集合得分是浮点值.您的分数和分数的日期时间都适合.
现在让我们将redis评分称为RScore.您可以将此人的分数放在该数字的最左边10位,将时间戳放在最右边的x位中.中间的位可以为零.
因此,每当您对Rscore进行排序时,它将首先按分数排序,如果存在平局,则将按正确位中的unix时间戳排序.要从RScore中查找得分的分数和时间戳,您只需要解析正确的位组.在python中执行此操作的示例实用程序在此处.
归档时间: |
|
查看次数: |
1108 次 |
最近记录: |