21.6 LIMIT选项的实现

在默认情况下,SORT命令总会将排序后的所有元素都返回给客户端:



redis> SADD alphabet a b c d e f
(integer) 6

集合中的元素是乱序存放的
redis> SMEMBERS alphabet
1) "d"
2) "c"
3) "a"
4) "b"
5) "f"
6) "e"

对集合进行排序,并返回所有排序后的元素
redis> SORT alphabet ALPHA
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"

但是,通过LIMIT选项,我们可以让SORT命令只返回其中一部分已排序的元素。

LIMIT选项的格式为LIMIT<offset><count>:

·offset参数表示要跳过的已排序元素数量。

·count参数表示跳过给定数量的已排序元素之后,要返回的已排序元素数量。

举个例子,以下代码首先对alphabet集合进行排序,接着跳过0个已排序元素,然后返回4个已排序元素:



redis> SORT alphabet ALPHA LIMIT 0 4
1) "a"
2) "b"
3) "c"
4) "d"

与此类似,以下代码首先对alphabet集合进行排序,接着跳过2个已排序元素,然后返回3个已排序元素:



redis> SORT alphabet ALPHA LIMIT 2 3
1) "c"
2) "d"
3) "e"

服务器执行SORT alphabet ALPHA LIMIT 0 4命令的详细步骤如下:

1)创建一个redisSortObject结构数组,数组的长度等于alphabet集合的大小。

2)遍历数组,将各个数组项的obj指针分别指向alphabet集合的各个元素,如图21-15所示。

3)根据obj指针所指向的集合元素,对数组进行字符串排序,排序后的数组如图21-16所示。

4)根据选项LIMIT 0 4,将指针移动到数组的索引0上面,然后依次访问array[0]、array[1]、array[2]、array[3]这4个数组项,并将数组项的obj指针所指向的元素"a"、"b"、"c"、"d"返回给客户端。

服务器执行SORT alphabet ALPHA LIMIT 2 3命令时的第一至第三步都和执行SORT alphabet ALPHA LIMIT 0 4命令时的步骤一样,只是第四步有所不同,上面的第4步如下:

4)根据选项LIMIT 2 3,将指针移动到数组的索引2上面,然后依次访问array[2]、array[3]、array[4]这3个数组项,并将数组项的obj指针所指向的元素"c"、"d"、"e"返回给客户端。

SORT命令在执行其他带有LIMIT选项的排序操作时,执行的步骤也和这里给出的步骤类似。

图21-15 将obj指针指向集合的各个元素

图21-16 排序后的数组