参考:
SORT key [BY pattern] [LIMIT offset count] [GET pattern] [ASC|DESC] [ALPHA] destination
最简单的用法:sort key
(sort key asc
)、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"
命令:sort key alpha
(sort key asc alpha
)、sort key desc alpha
示例:
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"
命令:
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
参数:
示例:
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"
命令:sort key by pattern get pattern ...
示例:
假设有以下数据:
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} 的大小来排序
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"
注:
在不排序的情况下,使用 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"
默认情况下, SORT 操作只是简单地返回排序结果,并不进行任何保存操作。
示例:
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"