redis排序

文章目录

  • 简介
  • SORT命令的实现
  • ALPHA选项的实现
  • ASC和DESC
  • BY
  • LIMIT
  • GET命令 类似映射
  • STORE选项的实现
  • 多个命令的执行顺序

简介

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

SORT命令的实现

服务器执行SORT numbers 命令的详细步骤如下:
1)创建一个个和numbers列表长度相同的数组,该数组的每个项都是个redis.h/redis SortObject结枸,如图
redis排序_第1张图片
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命令的执行步骤也和这里给出的SORTnumber命令的执行步骤类似。
redis排序_第2张图片

ALPHA选项的实现

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

SORT  ALPHA

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

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

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

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

ASC和DESC

SORT  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  ALPHA DESC BY  LIMIT   GET  STORE 
顺序:
1. SORT  ALPHA DESC BY 
2. LIMIT  
3. GET <get-pattern>
4. STORE 

你可能感兴趣的:(redis,数据库,缓存)