redis排序

Posted wsfu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis排序相关的知识,希望对你有一定的参考价值。

1、sort

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

127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 10
(integer) 2
127.0.0.1:6379> lpush list 5
(integer) 3
127.0.0.1:6379> sort list
1) "1"
2) "5"
3) "10"

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

 

2、BY参数

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

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

127.0.0.1:6379> lpush list 111 222 333 444 555 666 777 888 999
(integer) 9

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

127.0.0.1:6379> set stuscore:111 90
OK
127.0.0.1:6379> set stuscore:222 60
OK
127.0.0.1:6379> set stuscore:333 70
OK
127.0.0.1:6379> set stuscore:444 50
OK
127.0.0.1:6379> set stuscore:555 100
OK
127.0.0.1:6379> set stuscore:666 99
OK
127.0.0.1:6379> set stuscore:777 19
OK
127.0.0.1:6379> set stuscore:888 84
OK
127.0.0.1:6379> set stuscore:999 86

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

127.0.0.1:6379> sort list by stuscore:* desc
1) "555"
2) "666"
3) "111"
4) "999"
5) "888"
6) "333"
7) "222"
8) "444"
9) "777"

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

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

127.0.0.1:6379> del stuscore:333
(integer) 1
127.0.0.1:6379> sort list by stuscore:* desc
1) "555"
2) "666"
3) "111"
4) "999"
5) "888"
6) "222"
7) "444"
8) "777"
9) "333"

 

以上是关于redis排序的主要内容,如果未能解决你的问题,请参考以下文章

具体解释Redis源代码中的部分高速排序算法(pqsort.c)

如何利用redis来进行分布式集群系统的限流设计

jedis连接redis

以下代码片段的时间复杂度是多少?

markdown 数组排序片段

Java排序算法 - 堆排序的代码