redis排序(sort)

redis的排序和其它编程语言排序类似,都可以根据某些比较规则对一系列元素进行有序的排列。redis利用SORT命令可以对redis中的字符串、列表、集合、有序集合、散列中存储的数据进行排序。如果读者之前用过类似关系型数据库的话,那么redis的SORT命令可以看做SQL中的order by。


sort 命令

sort命令可以对list、set和sorted set的元素进行排序,然后显示排序的结果,但是不影响redis数据类型中存储数据的位置。就是说你对list进行元素排序,但是执行lrange命令你会发现内存中的元素的顺序是不发生任何变化的。因此sort命令的排序只是显示结果的排序。

sort排序命令的结构如下:

SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey]

下面就通过实例来一一讲解SORT排序的命令结构:

例子1、一般排序:

 --像链表list中加入实验数据
 lpush   list 1 2 4 5 3
 --查询数据在listSort链表中的物理位置
 lrange  list 0 -1
 --简单排序
 sort list 
 --简单的降序
 sort list desc

结果如下:(参数什么都不指定的情况下是按照数字升序排序的,当指定DESC时,将会 按照数字降序排序)

redis排序(sort)


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

--像链表list中加入实验数据
 lpush   list hello free world
--对其使用ALPHA排序
sort list alpha

结果如下:(当list表当中有字符串时,可以使用alpha参数对其进行排序,排序的结果是数字被当做是a,字符串之间再按照ASCII值进行排序)

redis排序(sort)


 例子3、使用limit修饰符限制返回结果。

sort list  alpha limit 2 5

结果如下:( limit 2 5指的是从list中的第二个偏移量(偏移量是从0,1,2....)开始往后取五个元素内的集合进行排序

redis排序(sort)


BY pattern等参数的排序通过下面的一个简单的学生信息表进行测试。表结构数据如下:

stuid name_stuid age_stuid
1 admin 25
2 free 29
3 zhangsan 26
4 redis 33

向redis中添加测试数据,代码如下:

 --添加四位学生学号
 lpush stulist 1 2 3 4
 
 --添加四位学生信息
 --admin
 mset name_1 admin age_1 25
 --free
 mset name_2 free age_2 29
 --zhangsan
 mset name_3 zhangsan age_3 26
 --redis
 mset name_4 redis  age_4 33

例子4、利用BY pattern通过外部key的数据作为权重进行排序,如:按照学生的年龄进行排序,代码如下:

sort stulist by age_*

redis排序(sort)

例子5、按照学生姓名进行排序。代码如下:

sort stulist by name_* alpha asc

redis排序(sort)


我们也可以通过get选项去获取指定pattern作为新key对应的值.

例子6、比如通过对stulist的学号进行排序获取到对应学号的学生姓名。代码如下:

sort stulist get name_*

redis排序(sort)


我们也可以利用hash表存储学生的基本信息,然后再对其进行排序。数据添加代码如下:

--admin 
hmset stu_1 name admin age 25
--free
hmset stu_2 name free age 29
--zhangsan 
hmset stu_3 name zhanggsan age 26
--redis 
hmset stu_4 name redis age 33

    例子7、通过对年龄字段进行排序获,代码如下:(可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域。)

sort stulist by stu_*->age

redis排序(sort)

例子8、通过学号的排序获取学生基本信息,代码如下:

sort stulist get # get stu_*->name get stu_*->age

redis排序(sort)