如何改写Lua脚本以实现Redis排序集的关系改写为长尾词?

2026-04-01 19:421阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计403个文字,预计阅读时间需要2分钟。

如何改写Lua脚本以实现Redis排序集的关系改写为长尾词?

我正在使用Redis排序集合来存储我正在进行的项目的命名。我们不想只是简单地按照分数字段排序项目,我们还想对具有相同分数字段的所有项目进行排序。具体来说,我们想要排序的是所有具有相同分数字段的项目。

如何改写Lua脚本以实现Redis排序集的关系改写为长尾词?

我正在使用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', KEYS[1], score, score, 'limit', 0, 1) return redis.call('zrevrank', KEYS[1], member[1]) + 1 else return -1 end

本文共计403个文字,预计阅读时间需要2分钟。

如何改写Lua脚本以实现Redis排序集的关系改写为长尾词?

我正在使用Redis排序集合来存储我正在进行的项目的命名。我们不想只是简单地按照分数字段排序项目,我们还想对具有相同分数字段的所有项目进行排序。具体来说,我们想要排序的是所有具有相同分数字段的项目。

如何改写Lua脚本以实现Redis排序集的关系改写为长尾词?

我正在使用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', KEYS[1], score, score, 'limit', 0, 1) return redis.call('zrevrank', KEYS[1], member[1]) + 1 else return -1 end