Redis的SORT可以对列表键、集合键或者有序结合键的值进行排列包括数字值、字符值(ALPHA)排序,ASC、DESC、BY、LIMIT、GET和STORE等操作.

一、 SORT 命令的实现

示例

    redis> RPUSH numbers 3 1 2 
    (integer) 3

    redis>SORT numbers
    1) "1"
    2) "2"
    3) "3"

Redis 执行 SORT 命令分为以下五个步骤:

  1. 创建一个长度与 numbers 相同的数组
  2. 遍历数组并将数组的指针指向 numbers 各个项
  3. 遍历数组并将 obj 指针指向的列表项转换为 double 类型浮点数,并存储到 u.score里面
  4. 根据 u.score 的值进行排列(默认从小到大)
  5. 再次遍历数组,按照数组的顺序将 obj 指向的列表项返还给客户端

数字排序

二、 ALPHA 选项

1. 示例

    redis> SADD fruits apple banana cherry 
    (integer) 3

    # 在SET中乱序存储
    redis>SMEMBERS fruits
    1) "apple"
    2) "cherry"
    3) "banana"

    # 通过使用 ALPHA 对字符串类型进行排序
    redis>SORT fruits ALPHA
    1) "apple"
    2) "banana"
    3) "cherry"

2. Redis 执行 SORT 命令分为以下五个步骤:

  1. 创建一个长度与 fruits 相同的数组
  2. 遍历数组并将数组的指针指向 fruits 各个项
  3. 对数组元素进行排序故 “apple” < “banana” < “cherry”
  4. 遍历数组,依顺序将 obj 指向的元素返还给客户端

字符串排序

三、 DESC ASC 选项

1. 示例

    redis> RPUSH numbers 3 1 2 
    (integer) 3

    redis>SORT numbers ASC
    1) "1"
    2) "2"
    3) "3"

    redis>SORT numbers DESC
    1) "3"
    2) "2"
    3) "1"

2. 简介

  1. 升序和降序都是通过相同的快速排序算法执行
  2. 步骤与 [一] 中一致

四、 BY 选项的实现

在默认情况中,SORT 使用被排序键包含的元素作为排序的权重,元素本身决定了元素在排序之后所处的位置。例如在 [二] 中提到的fruits的权重就是 “apple” > “banana” > “cherry”

    # 主要只用场景是对某个哈希所包含的 field 来作为元素权重,对一个键进行排序

    redis> SADD fruits apple banana cherry 
    (integer) 3

    redis> MSET apple-price 5 banana-price 4  cherry-price 8  
    (integer) 3

    # 通过使用 ALPHA 对字符串类型进行排序
    redis>SORT fruits BY *-price
    1) "banana"
    2) "apple"
    3) "cherry"

实现步骤

  1. 创建一个长度与 fruits 相同的数组
  2. 遍历数组并将数组的指针指向 fruits 各个项
  3. 遍历数组并将 obj 指针指向的集合元素所定的模式(*-price)
  4. 将权重值转化为 double 类型的浮点数,然后保存在u.score 属性里面
  5. 根据 u.score 的值进行排列(默认从小到大)
  6. 再次遍历数组,按照数组的顺序将 obj 指向的列表项返还给客户端

字符串排序

五、 LIMIT的实现

  默认中, SORT 会将全部排序好的数据染回,但是通过LIMIT选项我们可以让 SORT 命令值返回其中一部分已排序的元素.

    redis> SADD alphabet ALPHA 
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
    6) "f"

    # LIMIT <offset> <count>
    redis>SORT alphabet ALPHA LIMIT 1 3
    1) "b"
    2) "c"
    3) "d"

实现步骤

实现方法同增加了 ALPHA 的一致,不过在对于已经排序好的数组,直接从第 offer 的位置返回 count 个数据.

字符串排序

六、 STORE 的实现

  默认中, SORT 会将全部排序好的数据返回,但是不会保存排序结果,但是通过使用 STORE 选项我们可以将排序结果保存在指定键里面.

    redis> SADD student "peter" "jack" "tom"
    (integer) 3

    redis> SORT student ALPHA STORE sorted_student 
    (integer) 3

实现步骤

  1. 创建一个长度与 student 相同的数组
  2. 遍历数组并将数组的指针指向 student 各个项
  3. 根据 obj 指针所指的元素,对数组进行排序
  4. 检查键 sorted_studet 是否存在,如果存在则删除这个键
  5. 将 sorted_student 设置为空白的列表键
  6. 遍历数组将数组内容依次存入 sorted_student 中
  7. 遍历数组并将 “jack” “peter” “tom” 返回给客户端

字符串排序