redis怎么实现排列 redis如何排序_取值

Redis支持对List,Set,Sorted Set类型进行排序,sort的命令完整格式如下:
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

本文以list为示例,set以及zset的排序方法相同,不再举例。

1、最简单的用法,sort key,sort key desc

2、使用ALPHA对字符串进行排序

sort命令默认排序方式是从小到大进行数字排序,如果想按照字母排序,则可以使用alpha选项,可以和ASC/DESC同时使用。

在我使用的3.2.2版本中,如果集合/链表中存在不是数字的元素,使用sort排序没有alpha参数的话,会返回一个错误。

3、使用LIMIT限制返回结果

LIMIT主要是针对排序之后返回的结果进行限制,类似于mysql中的limit offset,count,这里也是跳过limit个选择count个。

比如选择分数为第二到第五名的3个人:

4、使用外部key进行排序

通过外部key进行排序,是通过[BY pattern]来实现的。通常外部key对应的都是一个string类型的数据。

给一个具体的例子来看下效果。

redis怎么实现排列 redis如何排序_数据结构与算法_02

这里tst_1到tst_4都是外部key,sort tst by相当于把list中所有的值,代入到tst_*的*里面,然后根据tst_*排序,最后返回*所代表的1,2,3,4返回的顺序。如上例中,tst_3是最大的为90,所以desc排序第一个是3,tst_1是最小的,所以最小的tst_1为30。此时的*也可以理解成一个占位符。

5、[BY pattern] 结合[GET pattern]

还是跟上面一样,*是占位符,只是取出来的不是sort的tst的结果,而是将tst的集代入到get后的key_*中的结果,如下例子:

redis怎么实现排列 redis如何排序_java_03

排序的结果是3、2、4、1,所以取值的结果是tst_3,tst_2,tst_4,tst_1,可以一次使用多个get,下面的user_*取值结果类似。当然,当by pattern里面的值有非数字的时候,需要带上alpha参数。

get # 表示获取被排序键的值,即自身。

6、获取外部键,但不进行排序。

通过将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作, 直接返回结果。具体的操作为sort key by not-exists-key。

可以看到,下面直接使用的时候,返回的结果跟push进去的时候一样,显然是跳过了sort操作,但是配合get pattern的时候,却可以很好的获取多个外部键。

7、将HashTable作为pattern使用

与用string类型相类似,只是需要用一个->指向表示用hash数据的哪一个field域排列。理解了String,很容易理解hash作为pattern的排列。

下面举一个例子:

redis怎么实现排列 redis如何排序_数据结构与算法_04

上例根据tst_*的field为id的域进行升序排列,按照id排序的话,tst_*的结果为tst_2,tst_4,tst_1,tst_3,所以取出来的值依次是heihei,lucy,rainn,jim。

8、保存sort结果

默认情况下sort操作只是简单地返回排序结果,并不进行任何保存操作。通过给store选项指定一个key参数,可以将排序结果保存到给定的键上。

如果被指定的key已存在,那么原有的值将被排序结果覆盖。