redis排序

1、sort

排序最常见的是sort命令,可以对列表或者有序集合排序,最简单的排序方式如下:

> lpush list
(integer)
> lpush list
(integer)
> lpush list
(integer)
> sort list
) "
) "
) "

该命令常与alpha、desc、limit等搭配使用。

2、BY参数

上述的使用方法比较简单,有时候无法满足人们的需求,以学生成绩为例,人们需要按照成绩,来排序,从而得到一个相应的学号的列表,这样比较复杂的排序使用上述的方法就不好操作了,因此需要用BY参数来操作。

首先准备一个学号的列表,且最终希望这个列表按照学生的成绩排列。

> lpush list
(integer) 

给每个学生设置成绩,键名为stuscore:学号

>
OK
>
OK
>
OK
>
OK
>
OK
>
OK
>
OK
>
OK
>  

比较容易看出,第一名是学号为555的学生,最后一名是学号为777的学生。

> sort list by stuscore:* desc
) "
) "
) "
) "
) "
) "
) "
) "
) "

可以看出,BY这个参数的实际作用是:将待排序列表中的每个键值带入到stuscore:*的*中,并对score:*进行排序,从而获得对应的学号列表。

若代入*的键值不存在,则默认为0

> del stuscore:
(integer)
> sort list by stuscore:* desc
) "
) "
) "
) "
) "
) "
) "
) "
) "

3、GET参数

获得到排序后的列表,可以通过这种形式获取对应学号的学生信息,如姓名。

设姓名的键名如:stuname:学号,则可以这样获取:

>  MR.zhang
OK
>  MR.wang
OK
>  MISS.li
OK
>  MISS.lin
OK
> sort list by stuscore:* desc get stuname:*
) (nil)
) (nil)
) "MR.zhang"
) (nil)
) "MISS.lin"
) "MR.wang"
) (nil)
) (nil)
) "MISS.li"

使用get #可以一并输出list中的值

> sort list by stuscore:* desc get stuname:* get #
 ) (nil)
 ) "
 ) (nil)
 ) "
 ) "MR.zhang"
 ) "
 ) (nil)
 ) "
 ) "MISS.lin"
) "
) "MISS.li"
) "
) "MR.wang"
) "
) (nil)
) "
) (nil)
) "

4、store参数

如果想要存储排序的结果,可以将结果存于列表中

> sort list by stuscore:* desc get stuname:* get # store sort.result
(integer)
> lrange sort.result  -
 ) ""
 ) "
 ) ""
 ) "
 ) "MR.zhang"
 ) "
 ) ""
 ) "
 ) "MISS.lin"
) "
) "MISS.li"
) "
) "MR.wang"
) "
) ""
) "
) ""
) "

5、性能优化

根据《redis入门指南》:

sort命令是redis一个很强大且复杂的命令,使用不好很容易成为性能瓶颈,故在开发的时候需要注意这么几点:

1)尽可能减少待排序的元素的数量

2)使用limit,值获取需要的数据

3)如果需要获取的数据量比较大,请用store保存

上一篇:2018.09.16 codeforces1041C. Coffee Break(双端队列)


下一篇:.NET截断字符串