Redis 有序集合在命令 SORT 中的行为

Redis 有序集合 Sorted set 在命令 SORT 中的行为

我们初始化一下有序集合,rank 是一个排行榜,score 是分数,member 是 用户ID,user:* 是用户信息,包含了分数和年龄。

127.0.0.1:6379> zadd rank 10000.0 '2' 10000.1 '3' 10000.4 '1' 9999 '5' 12000 '4'
(integer) 4
127.0.0.1:6379> set user:1 10000.4|14
OK
127.0.0.1:6379> set user:2 10000.0|11
OK
127.0.0.1:6379> set user:3 10000.1|13
OK
127.0.0.1:6379> set user:4 12000|24
OK
127.0.0.1:6379> set user:5 9999|20
OK

我们想按分数升序,取出 3 个用户的 ID 和年龄,有多少种写法呢?

普通写法

先用 ZREVRANGEBYSCORE 取出 member,再通过 GET user:${member} 获取用户年龄。

ZREVRANGEBYSCORE rank  100000 0 LIMIT 0 3
GET user:4
GET user:1
GET user:3

共计 4 次 Redis 请求,你可以将这 4 次 Redis 请求封装到 lua 脚本中进行执行。

SORT 命令

SORT 命令可以作用于 list, set 或者 sorted set。

当 SORT 作用于 sorted set 时,有如下行为:

  1. SORT 不显示指定排序键时,按照 member 的字典序升序排序
127.0.0.1:6379> SORT rank
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
  1. SORT 指定排序键为自身时,按照 score 进行升序排序
127.0.0.1:6379> SORT rank BY rank
1) "5"
2) "2"
3) "3"
4) "1"
5) "4"
  1. SORT 指定排序键不存在时(官方用 BY nosort 指代),按照自身 score 进行升序排序
127.0.0.1:6379> SORT rank BY not_exist
1) "5"
2) "2"
3) "3"
4) "1"
5) "4"
  1. SORT 指定排序键不存在时(官方用 BY nosort 指代),按照自身 score 进行排序,可以指定 DESC 进行降序排序
127.0.0.1:6379> SORT rank BY not_exist DESC
1) "4"
2) "1"
3) "3"
4) "2"
5) "5"

再使用 GET 来获取用户的年龄,其中 GET # 是将 rank 中的 member 返回。

127.0.0.1:6379> SORT rank BY not_exist ASC LIMIT 0 3 GET # GET user:*
1) "5"
2) "9999|20"
3) "2"
4) "10000.0|11"
5) "3"
6) "10000.1|13"

redis/redis/issues/98

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值