排序是我们经常遇到的问题,在Redis中,集合或列表都是无序的,有序集合是根据权重进行排序的。有时候我们希望获取到列表或集合是有序的,或者以某种非权重对有序集合进行排序。那么Redis给我们提供了SORT命令。

操作

1、集合进行排序【数字】

127.0.0.1:6379> SADD "users_id" 232 111 453 90 1121 #集合
(integer) 5
127.0.0.1:6379> SORT "users_id" #进行排序,默认为升序
1) "90"
2) "111"
3) "232"
4) "453"
5) "1121"
127.0.0.1:6379> SORT "users_id" DESC #可以指定DESC进行降序
1) "1121"
2) "453"
3) "232"
4) "111"
5) "90"
127.0.0.1:6379> SORT "users_id" DESC limit 0 2 #使用limit进行限制数量的返回
1) "1121"
2) "453"
127.0.0.1:6379> SORT "users_id" DESC limit 2 4
1) "232"
2) "111"
3) "90"

2、集合进行排序【非数字】

127.0.0.1:6379> SADD "users_name" "xiao" "wang" "abc" "hello" "world"
(integer) 5
127.0.0.1:6379> SORT "users_name" #这里如果是非数字的,就会报错,所以需要加上ALPHA修饰符 
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> SORT "users_name" ALPHA
1) "abc"
2) "hello"
3) "wang"
4) "world"
5) "xiao"
127.0.0.1:6379> SORT "users_name" ALPHA DESC
1) "xiao"
2) "world"
3) "wang"
4) "hello"
5) "abc"

3、我们不希望按照值的元素进行排序,而是根据其他的键中定义的权重来对元素进行排序

127.0.0.1:6379> SET "id_232" 5.0
OK
127.0.0.1:6379> SET "id_111" 4.9
OK
127.0.0.1:6379> SET "id_453" 4.0
OK
127.0.0.1:6379> SET "id_90" 5.8
OK
127.0.0.1:6379> SET "id_1121" 3.2
OK
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> SORT "users_id" BY "id_*"
1) "1121"
2) "453"
3) "111"
4) "232"
5) "90"
127.0.0.1:6379> SORT "users_id" BY "id_*" DESC
1) "90"
2) "232"
3) "111"
4) "453"
5) "1121"

4、有时候可能还会根据排序后的去获取某些键的值,需要结合上面的3进行处理

127.0.0.1:6379> set "name_232" "zhang"
OK
127.0.0.1:6379> set "name_111" "yang"
OK
127.0.0.1:6379> set "name_453" "li"
OK
127.0.0.1:6379> set "name_90" "xing"
OK
127.0.0.1:6379> set "name_1121" "lei"
OK
127.0.0.1:6379> SORT "users_id" BY "id_*" DESC GET "name_*"
1) "xing"
2) "zhang"
3) "yang"
4) "li"
5) "lei"

GET选项可以被多次使用,GET #表示获取元素本身

127.0.0.1:6379> SORT "users_id" BY "id_*" DESC GET #
1) "90"
2) "232"
3) "111"
4) "453"
5) "1121"

SORT命令还有一个选项是STORE,这个选项可以将结果保存到指定的键中

注意:SORT的时间复杂度为O(N+M*log(M)),其中N是列表或集合中的元素的个数,M是要返回的元素的条目。所以在对大量数据进行排序时,Redis服务器的性能会降低,所以一定要注意。