自学内容网 自学内容网

redis排序

简介

Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。

SORT命令的实现

服务器执行SORT numbers 命令的详细步骤如下:
1)创建一个个和numbers列表长度相同的数组,该数组的每个项都是个redis.h/redis SortObject结枸,如图
创建的数组结构
2)通历数组,将各个数组项的obj指针分别指向numbers列表的各个项,构成obj指针和列表项之间的一对一关系。

3)遍历数组,将各个obj指针所指向的列表项转换成一个double类型的浮点数,并将这个浮点数保存在相应数组项的u.score属性里面。

4)根据数组项u.score屆性的值,对数组进行数字值排序,排序后的数组项按u.score属性的值从小到大排列,如图所示。

5)遍历数组,将各个数组项的obj指针所指向的列表项作为排序结果返回给客户端,程序首先访问数组的索引0,返回u.score值为1.0的列表项"1";然后访问数组的索引1,返回u.score值为2.0的列表项"2";最后访问数组的索引2,返回u.score值为3.0的列表项"3”。

其他SORT<key>命令的执行步骤也和这里给出的SORTnumber命令的执行步骤类似。
排序后数组

ALPHA选项的实现

通过使用ALPHA选项,SORT命令可以对包含字符串值的键进行排序:

SORT <key> ALPHA

服务器执行SORT fruits ALPHA命令的详细步骤如下:
1)创建一个redis SortObject结构数组,数组的长度等于fruits集合的大小。

2)遍历数组,将各个数组项的obi指针分别指向fruits集合的各个元素。

3)根据obj指针所指向的集合元素,对数组进行字符串排序,排序后的数组项按集合元素的字符串值从小到大排列。这里类似于Java的字符串排序。

4)遍历数组,依次将数组项的obi指针所指向的元素返回给客户端。

ASC和DESC

SORT <key> ASC/DESC
// 默认ASC
// 实现类似于Comparetor

BY

1.RPUSH fruit apple banana cherry
// 其实就是一次性塞入多个key-value
2.MSET apple-price 8 banana-price 5.5 cherry-price 7
// 排序
3.SORT fruit by *-price

//用ALPHA同理  在最后加上ALPHA就行

LIMIT

SORT key by pattern LIMIT offset count

GET命令 类似映射

通过使用GET选项,我们可以让SORT命令在对键进行排序 之后,根据被排序的元素,以及GET选项所指定的模式,查找并返回某 些键的值。

STORE选项的实现

在默认情况下,SORT命令只向客户端返回排序结果,而不保存排序结果。但是,通过使用STORE选项,我们可以将排序结果保存在指定的键里面,并在有需要时重用这个排序结果:

SORT key STORE new_key

多个命令的执行顺序

如果按照选项来划分的话,一个SORT命令的执行过程可以分为以下四步:

1)排序:在这一步,命令会使用ALPHA、ASC或DESC、BY这几 个选项,对输入键进行排序,并得到一个排序结果集。

2)限制排序结果集的长度:在这一步,命令会使用LIMIT选项, 对排序结果集的长度进行限制,只有LIMIT选项指定的那部分元素会被 保留在排序结果集中。

3)获取外部键:在这一步,命令会使用GET选项,根据排序结果 集中的元素,以及GET选项指定的模式,查找并获取指定键的值,并用 这些值来作为新的排序结果集。

4)保存排序结果集:在这一步,命令会使用STORE选项,将排序 结果集保存到指定的键上面去。

5)向客户端返回排序结果集:在最后这一步,命令遍历排序结果集,并依次向客户端返回排序结果集中的元素。

执行命令:
SORT <key> ALPHA DESC BY <by-pattern> LIMIT <offset> <count> GET <get- pattern> STORE <store_key>
顺序:
1. SORT <key> ALPHA DESC BY <by-pattern>
2. LIMIT <offset> <count>
3. GET <get-pattern>
4. STORE <store_key>

原文地址:https://blog.csdn.net/flyingmylife/article/details/135849460

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!