加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua – Redis排序集并解决关系

发布时间:2020-12-14 21:45:00 所属栏目:大数据 来源:网络整理
导读:我正在使用Redis排序集来存储我正在进行的项目的排名.我们没想到(!)我们想要如何处理关系. Redis按字典顺序对具有相同分数的条目进行排序,但我们想要做的是对具有相同分数的所有条目赋予相同的等级,例如在 redis 127.0.0.1:6379 ZREVRANGE foo 0 -1 WITHSCO
我正在使用Redis排序集来存储我正在进行的项目的排名.我们没想到(!)我们想要如何处理关系. Redis按字典顺序对具有相同分数的条目进行排序,但我们想要做的是对具有相同分数的所有条目赋予相同的等级,例如在

redis 127.0.0.1:6379> ZREVRANGE foo 0 -1 WITHSCORES
1) "first"
2) "3"
3) "second3"
4) "2"
5) "second2"
6) "2"
7) "second1"
8) "2"
9) "fifth"
10) "1"

我们想要将second1,second2和second3视为具有位置2,并且将第五个视为具有位置5.因此,在第三或第四位置中没有条目. ZREVRANK在这里没用,那么获得我想要的数字的最佳方法是什么?

解决方法

在我看来,一种方法是编写一个小的Lua脚本并使用EVAL命令.由此产生的操作仍具有对数复杂性.

例如,假设我们对second2的位置感兴趣.在脚本中,首先我们用ZSCORE得分,得到2.然后我们使用ZRANGEBYSCORE获得第一个带有该得分的条目,获得second3.我们所追求的位置是第二场的ZREVRANK加1.

redis 127.0.0.1:6379> ZSCORE foo second2
"2"
redis 127.0.0.1:6379> ZREVRANGEBYSCORE foo 2 2 LIMIT 0 1
1) "second3"
redis 127.0.0.1:6379> ZREVRANK foo second3
(integer) 1

所以脚本可能是这样的

local score = redis.call('zscore',KEYS[1],ARGV[1])
if score then
  local member = redis.call('zrevrangebyscore',score,'limit',1)
  return redis.call('zrevrank',member[1]) + 1
else return -1 end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读