博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis排序理论
阅读量:5085 次
发布时间:2019-06-13

本文共 4886 字,大约阅读时间需要 16 分钟。

redis排序使用sort命令。能够对列表键、集合键或者有序集合键的值进行排序。

几个简单的例子:
(1)对列表键的值进行排序(数值列表)
127.0.0.1:6379> rpush numbers 1 4 8 2 3 9 4
(integer) 7
127.0.0.1:6379> lrange numbers 0 -1
1) "1"
2) "4"
3) "8"
4) "2"
5) "3"
6) "9"
7) "4"
127.0.0.1:6379> sort numbers
1) "1"
2) "2"
3) "3"
4) "4"
5) "4"
6) "8"
7) "9"
(2)对列表键的值进行排序(字符列表)
127.0.0.1:6379> rpush charlist a g b d s f
(integer) 6
127.0.0.1:6379> lrange charlist 0 -1
1) "a"
2) "g"
3) "b"
4) "d"
5) "s"
6) "f"
127.0.0.1:6379> sort charlist alpha
1) "a"
2) "b"
3) "d"
4) "f"
5) "g"
6) "s"
(3)对列表键的值进行排序(字符串列表)
127.0.0.1:6379> lpush stringlist "abc" "sdf" "123sdf" "sssfadf"
(integer) 4
127.0.0.1:6379> lrange stringlist 0 -1
1) "sssfadf"
2) "123sdf"
3) "sdf"
4) "abc"
127.0.0.1:6379> sort stringlist alpha
1) "123sdf"
2) "abc"
3) "sdf"
4) "sssfadf"
(4)对集合键进行排序(字符集合)
127.0.0.1:6379> sadd charset a f s r c b
(integer) 6
127.0.0.1:6379> smembers charset
1) "c"
2) "s"
3) "r"
4) "b"
5) "a"
6) "f"
127.0.0.1:6379> sort charset alpha
1) "a"
2) "b"
3) "c"
4) "f"
5) "r"
6) "s"
127.0.0.1:6379>
(5)BY 选项初探。使用sort命令的by选项以jack_number , peter_number , tom_number三个键的值为权重,对有序集合test_result中的“jack” , “Peter” , “tom”三个成员进行排序。
127.0.0.1:6379> zadd test-result 3.0 jack 3.5 peter 4.0 tom
(integer) 3
127.0.0.1:6379> zrange test-result 0 -1
1) "jack"
2) "peter"
3) "tom"
127.0.0.1:6379> mset peter_number 1 tom_number 2 jack_number 3
OK
127.0.0.1:6379> sort test-result by *_number
1) "peter"
2) "tom"
3) "jack"
127.0.0.1:6379>
以下介绍包括sort命令及其选项(ASC , DESC , ALPHA , LIMIT , STORE , BY , GET)原理。
1、SORT <key>
    作用:主要可对包含数值键的key进行排序。
    示例:sort numbers
    原理:以列表为例,目标列表numbers
        1)创建于numbers列表长度相同的数组。数组中每个节点结构有两个属性(指针,浮点)。
        2)遍历数组,将各个数组项指针指向numbers各个节点,建立一对一关系。
        3)遍历数组,将各个指针所指向的列表项转换成一个double类型的值存储在数组项中。
        4)根据浮点值进行数组排序。
        5)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。
    注意:SORT命令为排序键创建长度相同的数组键。
                数组项使用的数据结构是:redisSortObject。
                根据SORT选项的不同,使用redisSortObject的方式也不同。
2、ALPHA选项
    作用:使用该选项,SORT命令可以对包含字符串值得key进行排序。
    示例:sort fruits alpha
    原理:以集合为例,目标集合fruits。
        1)创建redisSortObject结构数组,长度与fruits长度相同。
        2)遍历数组,将数组各项指针指向fruits集合中各个元素。
        3)根据集合内字符串元素对数组进行排序。
        4)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。
    注意:使用该选项未使用redisSortObject中的浮点属性。
3、ASC、DESC选项
    作用:对排序后的结果集进行升序(ASC)或降序(DESC)排列。主要可对包含数值键的key。
    示例:sort numbers asc/desc
    原理:与SORT <key>原理基本相同
    注意:均使用快排。
                升序时使用对比函数产生升序对比结果。
                降序时使用对比函数产生降序对比结果。
4、BY选项
    作用:SORT命令可以制定某些字符串键,或者某个哈希键所包含的某些域来作为元素的权重,对一个键进行排序。
                默认情况下SORT命令使用被排序键所包含的元素作为排序的权重,元素本身决定了元素在排序后所处的位置。
    示例:SORT <key> BY <pattern>
    原理:以列表为例,目标列表fruits。
        1)创建redisSortObject结构数组,长度与fruits长度相同。
        2)遍历数组,将数组各项指针指向fruits列表中各个元素。
        3)遍历数组,根据各个数组项指针所指的列表元素,以及BY选项所制定的模式(*-price),查找相应的权重键。
        4)将各个权重键的值保存在数组浮点属性中。
        5)根据数组各项权重值对数组进行排序。
        6)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。
5、带ALPHA的BY选项
    作用:单纯的BY选项默认假设权重键保存的值为数值。如果值为字符串,就需要ALPHA的配合。
    示例:SORT <key> BY <pattern> ALPHA
    原理:原理与BY选项基本相同。不同点在第五步,是对字符串还是数值进行排序。
6、LIMIT选项
    作用:返回SORT命令排序后的结果集的一部分,类似一次分页查找。
    示例:SORT alphabet ALPHA LIMIT 0 4 , SORT alphabet ALPHA LIMIT 2 4
    原理:原理与其他SORT命令基本相同,不同点在于返回数据给客户端时按照LIMIT的两个参数(LIMIT <offset  count>)限制结果集大小。
7、GET选项
    作用:SORT对键进行排序后,根据被排序的元素,以及GET选项所制定的模式,查找并返回某些键的值。
    示例:SORT students ALPHA GET *-name(SORT <KEY> OPTIONS GET <PATTERN>)
    原理:
        1)创建redisSortObject结构数组,长度与students集合大小相同。
        2)遍历数组,将数组各项指针指向students集合中各个元素。
        3)根据GET选项前的参数进行排序操作。
        4)遍历数组,根据指针元素所指向的集合元素,以及GET选项所给定的模式,查找相应的键。
        5)遍历查找之前返回的键,进而返回值。
    注意:可以同时存在多个GET,通过遍历排序后的结果集,多个GET依次获取键值并返回给客户端。
    实验:实验7.1
8、STORE选项
    作用:将SORT选项排序后的结果集存储到其他key中。
    示例:SORT numberset STORE temp
    原理:排序后将结果集放入列表中。
    注意:只能放入列表中,若制定的目标类型非列表,redis进行数据结构调整(之前的数据清除)。
9、选项执行顺序
    SORT命令执行步骤:
        1)排序:ALPAH,ASC/DESC,BY
        2)限制结果集:LIMIT选项
        3)获取外部键:GET
        4)保存排序结果集:STORE
        5)返回客户端结果
        redis按照以上步骤执行SORT命令,因此与选项拜访顺序基本无关,但是多个GET选项除外。
    注意:GET选项的摆放顺序决定返回客户端结果集的结构一致性。
附录:
实验7.1
127.0.0.1:6379> sadd students "peter" "jack" "tom"
(integer) 3
127.0.0.1:6379> smembers students
1) "jack"
2) "peter"
3) "tom"
127.0.0.1:6379> mset peter-name "Peter White"  jack-name "Jack Snow" tom-name "Tom Smith"
OK
127.0.0.1:6379> sort students alpha get *-name
1) "Jack Snow"
2) "Peter White"
3) "Tom Smith"
127.0.0.1:6379> mset peter-birth "2016/3/15 22:53:01"  jack-birth "2016/3/13 22:53:12" tom-birth "2016/3/16 22:53:15"
OK
127.0.0.1:6379> sort students alpha get *-name get *-birth
1) "Jack Snow"
2) "2016/3/13 22:53:12"
3) "Peter White"
4) "2016/3/15 22:53:01"
5) "Tom Smith"
6) "2016/3/16 22:53:15"
127.0.0.1:6379>
实验8.1
127.0.0.1:6379> lrange charlist 0 -1
1) "a"
2) "g"
3) "b"
4) "d"
5) "s"
6) "f"
127.0.0.1:6379> del temp
(integer) 1
127.0.0.1:6379> sadd temp "asdffasdf"
(integer) 1
127.0.0.1:6379> smembers temp
1) "asdffasdf"
127.0.0.1:6379> sort charlist alpha store temp
(integer) 6
127.0.0.1:6379> type charlist
list
127.0.0.1:6379> type temp
list
127.0.0.1:6379> sort charset alpha store temp
(integer) 6
127.0.0.1:6379> type charset
set
127.0.0.1:6379> smembers temp
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lrange temp 0 -1
1) "a"
2) "b"
3) "c"
4) "f"
5) "r"
6) "s"
127.0.0.1:6379>
                

转载于:https://www.cnblogs.com/cococo/p/5281730.html

你可能感兴趣的文章
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
python的列表与shell的数组
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>
React文档翻译 (快速入门)
查看>>
nodejs fs路径
查看>>
动态规划算法之最大子段和
查看>>
linux c:关联变量的双for循环
查看>>