gpt4 book ai didi

lua - Redis 排序集和解决关系

转载 作者:IT王子 更新时间:2023-10-29 05:59:33 24 4
gpt4 key购买 nike

我正在使用 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"

我们想考虑 second1second2second3 都具有位置 2,而 fifth 具有位置 5。因此,第三或第四位置没有条目。 ZREVRANK 在这里没有用,那么获取我要查找的数字的最佳方法是什么?

最佳答案

在我看来,一种方法是编写一个小的 Lua 脚本并使用 EVAL 命令。生成的操作仍然具有对数复杂度。

例如,假设我们对second2 的位置感兴趣。在脚本中,首先我们使用 ZSCORE 获取其分数,获得 2。然后我们使用 ZRANGEBYSCORE 获取具有该分数的第一个条目,获得 second3 .我们之后的位置是 second3ZREVRANK 加 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', KEYS[1], score, score, 'limit', 0, 1)
return redis.call('zrevrank', KEYS[1], member[1]) + 1
else return -1 end

关于lua - Redis 排序集和解决关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14944279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com