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类型的数据。
给一个具体的例子来看下效果。
这里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_*中的结果,如下例子:
排序的结果是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的排列。
下面举一个例子:
上例根据tst_*的field为id的域进行升序排列,按照id排序的话,tst_*的结果为tst_2,tst_4,tst_1,tst_3,所以取出来的值依次是heihei,lucy,rainn,jim。
8、保存sort结果
默认情况下sort操作只是简单地返回排序结果,并不进行任何保存操作。通过给store选项指定一个key参数,可以将排序结果保存到给定的键上。
如果被指定的key已存在,那么原有的值将被排序结果覆盖。