参考:
一、命令
SORT key [BY pattern] [LIMIT offset count] [GET pattern] [ASC|DESC] [ALPHA] destination
- 返回或保存给定列表(list)、集合(set)、有序集合(zset) key 中经过排序的元素
- 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较
二、使用
2.1 一般SORT用法
最简单的用法:sort key
(sort key asc
)、sort key desc
- sort key:升序排序
- sort key desc:降序排序
示例:
redis> lpush nums 3 2 1
(integer) 3
redis> sort nums
1) "1"
2) "2"
3) "3"
redis> sort nums desc
1) "3"
2) "2"
3) "1"
2.2 使用 ALPHA 对字符串进行排序
命令:sort key alpha
(sort key asc alpha
)、sort key desc alpha
- 注:如果系统正确地设置了 LC_COLLATE 环境变量的话,Redis能识别 UTF-8 编码
示例:
redis> lpush strs c b a
(integer) 3
# 可以看出默认将元素转换成double再进行排序的
redis> sort strs
(error) ERR One or more scores can't be converted into double
redis> sort strs alpha
1) "a"
2) "b"
3) "c"
redis> sort strs desc alpha
1) "c"
2) "b"
3) "a"
2.3 使用 LIMIT 修饰符限制返回结果
命令:
sort key limit offset count
(sort key limit offset count asc
)sort key limit offset count desc
sort key limit offset count alpha
(sort key limit offset count asc alpha
)sort key limit offset count desc alpha
参数:
- offset:要跳过的元素数量(偏移量),从0开始
- count:从 offset 开始返回的元素数量
示例:
redis> lpush nums 3 2 1
(integer) 3
redis> sort nums limit 0 1
1) "1"
redis> sort nums limit 0 1 desc
1) "3"
redis> sort strs limit 0 1 desc alpha
1) "c"
2.4 使用外部 key 进行排序
命令:sort key by pattern get pattern ...
- 使用外部 key 的数据作为权重,代替默认的直接对比键值的方式来进行排序
示例:
假设有以下数据:
uid | user_name_{uid} | user_level_{uid} |
---|---|---|
1 | a | 40 |
2 | b | 10 |
3 | c | 20 |
4 | d | 30 |
初始化数据:
redis> lpush uid 1 2 3 4
(integer) 4
redis> mset user_name_1 a user_name_2 b user_name_3 c user_name_4 d
OK
redis> mset user_level_1 40 user_level_2 10 user_level_3 20 user_level_4 30
OK
(1)BY选项
通过使用 BY 选项,可以让 uid 按其他键的元素来排序。
如:让 uid 键按照 user_level_{uid} 的大小来排序
- user_level_* 是一个占位符, 它先取出 uid 中的值, 然后再用这个值来查找键对应的值
- 在对 uid 列表进行排序时, 程序就会先取出 uid 的值 1、2、3、4 , 然后使用 user_level_1、user_level_2、user_level_3和 user_level_4的值作为排序 uid 的权重
redis> sort uid by user_level_*
1) "2"
2) "3"
3) "4"
4) "1"
(2)GET选项
使用 GET 选项, 可以根据排序的结果来取出相应的键值
示例:先排序 uid , 再取出键 user_name_{uid} 的值:
redis> sort uid get user_name_*
1) "a"
2) "b"
3) "c"
4) "d"
(3)组合使用 BY 和 GET
同时使用BY、GET选项,根据外部键的元素排序后,再取出指定键的元素
示例:先按 user_level_{uid} 来排序 uid 列表, 再取出相应的 user_name_{uid} 的值:
redis> sort uid by user_level_* get user_name_*
1) "b"
2) "c"
3) "d"
4) "a"
(4)获取多个外部键
同时使用多个 GET 选项, 获取多个外部键的值
示例:
按 uid 分别获取 user_level_{uid} 和 user_name_{uid} :
redis> sort uid get user_level_* get user_name_*
1) "40"
2) "a"
3) "10"
4) "b"
5) "20"
6) "c"
7) "30"
8) "d"
GET 有一个额外的参数规则:用 # 获取被排序键的值。
将 uid 的值、及其相应的 user_level_* 和 user_name_* 都返回为结果:
redis> sort uid get # get user_level_* get user_name_*
1) "1"
2) "40"
3) "a"
4) "2"
5) "10"
6) "b"
7) "3"
8) "20"
9) "c"
10) "4"
11) "30"
12) "d"
(5)获取外部键,但不进行排序
将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作, 直接返回结果:
redis> sort uid by not_exist_key
1) "4"
2) "3"
3) "2"
4) "1"
注:
- 这种用法在单独使用时,没什么实际用处
- 通过将这种用法和 GET 选项配合, 就可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于数据库的 join 关键字)
在不排序的情况下,使用 SORT 、 BY 和 GET 获取多个外部键:
redis> sort uid by not_exist_key get # get user_level_* get user_name_*
1) "4"
2) "30"
3) "d"
4) "3"
5) "20"
6) "c"
7) "2"
8) "10"
9) "b"
10) "1"
11) "40"
12) "a"
(6)将哈希表作为 GET 或 BY 的参数
除了可以将信息保存在字符串中,通过 xxx_*
方式引用外部键进行排序(BY)、获取外部键对应的值(GET),还可以使用 哈希表 作为 GET 或 BY 选项的参数 。
例如上面示例中的用户信息,可以将其用哈希表形式保存:
redis> hmset user_info_1 name a level 40
OK
redis> hmset user_info_2 name b level 10
OK
redis> hmset user_info_3 name c level 20
OK
redis> hmset user_info_4 name d level 30
OK
使用 key->field
的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域:
redis> sort uid by user_info_*->level
1) "2"
2) "3"
3) "4"
4) "1"
redis> sort uid by user_info_*->level get user_info_*->name
1) "b"
2) "c"
3) "d"
4) "a"
2.5 保存排序结果
默认情况下, SORT 操作只是简单地返回排序结果,并不进行任何保存操作。
- 通过给 STORE 选项指定一个 key 参数,可以将排序结果保存到给定的键上
- 如果被指定的 key 已存在,那么原有的值将被排序结果覆盖。
示例:
redis> rpush nums 1 3 5 2 4 6
(integer) 6
redis> sort nums store sorted_nums
(integer) 6
redis> lrange sorted_nums 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"