Redis 排序 高级
sort排序的语法:
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]]
[ASC | DESC] [ALPHA] [STORE destination]
用来返回或保存给定列表、集合、有序集合中经过排序的元素。
- [BY pattern]:sort 命令默认使用集合元素进行排序,可以通过 “BY pattern” 使用外部 key 的数据作为权重排序。
- [LIMIT offset count]:排序之后返回元素的数量可以通过 LIMIT 修饰符进行限制,修饰符接受 offset (要跳过的元素数量,即起始位置)和 count (返回的元素数量)两个参数。
- [GET pattern [GET pattern …]]:get 可以根据排序的结果来取出相应的键值,“get #” 表示返回自身元素,“get pattern” 可以返回外部 key 的数据 。
- [ASC|DESC] [ALPHA]:选择按照顺序、逆序或者字符串排序,set 集合(本身没有索引值)排序操作必须指定 ALPHA。
- [STORE destination]:默认情况下, sort 操作只是简单地返回排序结果,并不进行任何保存操作。通过给 store 选项指定一个 key 参数,可以将排序结果保存到给定的键上。
sort是Redis中最强大最复杂的命令之一,如果使用不好很容易成为性能瓶颈。SORT命令的时间复杂度是O(n+mlogm ),其中n 表示要排序的列表(集合或有序集合)中的元素个数,m表示要返回的元素个数。当n 较大的时候sort命令的性能相对较低,并且Redis在排序前会建立一个长度为n(有一个例外是当键类型为有序集合且参考键为常量键名时容器大小为m 而不是n)的容器来存储待排序的元素,虽然是一个临时的过程,但如果同时进行较多的大数据量排序操作则会严重影响性能。
开发中使用SORT命令时需要注意以下几点。
(1)尽可能减少待排序键中元素的数量(使n 尽可能小)。
(2)使用LIMIT参数只获取需要的数据(使m 尽可能小)。
(3)如果要排序的数据数量较大,尽可能使用STORE参数将结果缓存。
示例1、普通的升序降序排序
- sort key 按照key进行升序排序
- sort key desc 按照key进行降序排序
示例2、使用ALPHA修饰符对字符串进行排序
sort 默认使用数据进行排序,如果value是字符串,需要再key后面增加alpha参数,否则会报错。
示例3、使用limit限制返回结果
limit可以接受两个参数:
- offset 指定要跳过的元素数量
- count 指定跳过 offset 个指定的元素之后,要返回多少个对象
示例4、使用外部key进行排序
可以使用外部key 的数据作为权重,代替默认直接对比键值进行排序。
数据
编号 | 姓名 | 年龄 |
---|---|---|
1 | zhangsan | 18 |
2 | lisi | 17 |
3 | wanger | 19 |
4 | mazi | 20 |
4.1、使用BY参数
BY 参数的语法为“BY参考键”。其中参考键可以是字符串类型键或者是散列类型键的某个字段(表示为键名—>字段名)。如果提供了BY参数,SORT命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个“*”并获取其值,然后依据该值对元素排序。
4.2、使用GET参数
GET参数不影响排序,它的作用是使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。GET参数的规则和BY参数一样,GET参数也支持字符串类型和散列类型的键,并使用“*”作为占位符。
在一个SORT命令中可以有多个GET参数,而BY参数只能有一个,有N个GET参数,每个元素返回的结果就有N行。
4.3、组合使用BY和GET参数,同时可以获取多个字段
4.4、获取外部键,但不进行排序
将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作。通过将这种用法和 GET 选项配合, 可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于 SQL 数据库的 join 关键字)
当参考键名不包含“*”时(即常量键名,与元素值无关),SORT命令将不会执行排序操作,因为Redis认为这种情况是没有意义的(因为所有要比较的值都一样)
GET # 可以获取排序的外键
5、将哈希表作为get或by的参数
数据:
5.1、示例:按照name进行排序,并输出id,name,age
BY 和 GET 选项都可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域
参考键虽然支持散列类型,但是“*”只能在“->”符号前面( 即键名部分)才有用,在“->”后( 即字段名部分) 会被当成字段名本身而不会作为占位符被元素的值替換,即常量键名。
5.2、保存排序结果
默认sort仅用来排序,不会存储排序结果,可以使用STORE将结果存储到指定key中。保存后的键的类型为列表类型,如果键已经存在则会覆盖它。加上STORE参数后SORT命令的返回值为结果的个数。