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

Posted qyvlik

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Redis 有序集合在命令 SORT 中的行为的主要内容,如果未能解决你的问题,请参考以下文章

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

redis 排序命令

Redis入门 - 排序

Redis入门 - 排序

redis有序集合类型sort set

redis-sort命令