Redis学习笔记 - 排序(1) - 使用SORT命令

参考:

一、命令

SORT key [BY pattern] [LIMIT offset count] [GET pattern] [ASC|DESC] [ALPHA] destination

  • 返回或保存给定列表(list)、集合(set)、有序集合(zset) key 中经过排序的元素
  • 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较

二、使用

2.1 一般SORT用法

最简单的用法:sort keysort 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 alphasort 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 countsort key limit offset count asc
  • sort key limit offset count desc
  • sort key limit offset count alphasort 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 的数据作为权重,代替默认的直接对比键值的方式来进行排序

示例:

假设有以下数据:

uiduser_name_{uid}user_level_{uid}
1a40
2b10
3c20
4d30

初始化数据:

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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值