【问题标题】:From redis sorted set, retrieving the rank of the highest value that has score just less than given score从 redis 排序集中,检索分数低于给定分数的最高值的排名
【发布时间】:2016-12-03 15:43:18
【问题描述】:

如何从 redis 排序集中检索 最高值排名,其分数刚好低于给定分数?

例如,假设我的排序集是:

rank value score
1)   'a'   -10
2)   'd'   -4
3)   'c'   0
4)   'b'   2
5)   'e'   10

具体来说,如果给我分数 12,我想检索排名 5。如果给我分数 1,我想检索排名 3。如果给我分数 -11,我想检索什么都不检索。

【问题讨论】:

    标签: redis


    【解决方案1】:

    注意 #1:排序集中的排名是从 0 开始的

    注意 #2:您必须执行两个查询,一个用于查找元素,另一个用于获取其排名。

    使用redis-cli的示例:

    127.0.0.1:6379> ZADD z -10 a -4 d 0 c 2 b 10 e
    (integer) 5
    127.0.0.1:6379> ZREVRANGEBYSCORE z (12 -inf LIMIT 0 1
    1) "e"
    127.0.0.1:6379> ZRANK z e
    (integer) 4
    127.0.0.1:6379> ZREVRANGEBYSCORE z (1 -inf LIMIT 0 1
    1) "c"
    127.0.0.1:6379> ZRANK z c
    (integer) 2
    127.0.0.1:6379> ZREVRANGEBYSCORE z (-11 -inf LIMIT 0 1
    (empty list or set)
    

    当然,Lua 脚本非常适合这种情况,即:

    $ cat script.lua 
    local r=redis.call('ZREVRANGEBYSCORE', KEYS[1], '('..ARGV[1], '-inf', 'LIMIT', 0, 1)
    if #r > 0 then
      r=redis.call('ZRANK', KEYS[1], r[1])
    end
    return r
    $ redis-cli --eval script.lua z , 12
    (integer) 4
    $ redis-cli --eval script.lua z , 1
    (integer) 2
    $ redis-cli --eval script.lua z , -11
    (empty list or set)
    

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      相关资源
      最近更新 更多