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 命令分为以下五个步骤:
- 创建一个长度与 numbers 相同的数组
- 遍历数组并将数组的指针指向 numbers 各个项
- 遍历数组并将 obj 指针指向的列表项转换为 double 类型浮点数,并存储到 u.score里面
- 根据 u.score 的值进行排列(默认从小到大)
- 再次遍历数组,按照数组的顺序将 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 命令分为以下五个步骤:
- 创建一个长度与 fruits 相同的数组
- 遍历数组并将数组的指针指向 fruits 各个项
- 对数组元素进行排序故 “apple” < “banana” < “cherry”
- 遍历数组,依顺序将 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. 简介
- 升序和降序都是通过相同的快速排序算法执行
- 步骤与 [一] 中一致
四、 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"
实现步骤
- 创建一个长度与 fruits 相同的数组
- 遍历数组并将数组的指针指向 fruits 各个项
- 遍历数组并将 obj 指针指向的集合元素所定的模式(*-price)
- 将权重值转化为 double 类型的浮点数,然后保存在u.score 属性里面
- 根据 u.score 的值进行排列(默认从小到大)
- 再次遍历数组,按照数组的顺序将 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
实现步骤
- 创建一个长度与 student 相同的数组
- 遍历数组并将数组的指针指向 student 各个项
- 根据 obj 指针所指的元素,对数组进行排序
- 检查键 sorted_studet 是否存在,如果存在则删除这个键
- 将 sorted_student 设置为空白的列表键
- 遍历数组将数组内容依次存入 sorted_student 中
- 遍历数组并将 “jack” “peter” “tom” 返回给客户端