Redis排序理论

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>

时间: 2024-10-14 15:00:24

Redis排序理论的相关文章

redis 排序(转)

本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey]  下面我们一一说明各种命令选项 (1)sort key 这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果.下面给个例子 redis> lpush ml

三.redis 排序

本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey]  下面我们一一说明各种命令选项 (1)sort key 这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果.下面给个例子 redis> lpush ml

redis使用基础(四) ——Redis排序与消息通知

redis使用基础(四) --Redis排序与消息通知 (转载请附上本文链接--linhxx) 一.排序 1.命令 SORT key [ALPHA] [DESC] [LIMIT start end],对列表.集合和有序集合进行排序,当加上alpha参数后,则可以按照字典顺序排序,加上desc则倒序排序,加上limit则支持分页. 2.关键参数 by参数:by key:*->val,可以指定排序的标准,可以自己传入一个list,也可以指定某个列进行排序. get参数:get key:*->val

redis排序

参考:http://www.cnblogs.com/redcreen/archive/2011/02/15/1955226.html redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如 下: SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey] 下面我们一一说明各种命令选项 (1)sort key 这个是最简单的情况,没

redis 排序 及 取出Hset中的多个数据(sort get 命令实践)

直接上命令 SORT carCondition-17.5-40 by car-*->id desc get car-*->chehao get car-*->id carCondition-17.5-40 在我测试里是 set  可以对 list 和 zset 进行操作   我在set中存储的是 car的id号 car-*   是所有车辆的实体 类型是 hset sort 命令 是让 carCondition-17.5-40 中所有的车辆的id 按照 车辆实体的id进行倒序排序 然后 g

重温redis命令

redis是已知的性能最快的key-value 数据库. 1.key相关命令 exites key :检查指定的key是否存在 1表示存在 0表示不存在 del key1,key2,key3....:删除指定的key,返回删除key的个数,如果key都不存在返回0 type key :返回给的key的value的类型.返回none表示key不存在,string表示字符串,list表示链表,set表示无序集合... keys pattern :返回匹配指定模式的所有key expire key s

解决Redis Cluster模式下的排序问题

通常的redis排序我们可以这么做: 比如按商品价格排序:sort goods_id_set by p_*_price 这样在非集群模式下是没问题的,但如果在集群模式下,就会报错: 说是在集群模式下不能用sort的by子句,因为在集群模式下,上面的p_*_price匹配的key可能分布在不同的节点的slot中,所以无法做到排序. 那怎么办咧?别急,办法还是有的,我们就用 SortedSet 怎么用呢?很简单,看代码: 我们先添加几个商品,并赋上价格 zadd goods_prices 10 1

C 冒泡排序和选择排序

冒泡排序 理论: 从第一个数开始,将相邻的两个数比较,第一个数和第二个数比较.....,要是是从小到大的排序,要是后面的数比前面的大则交换两个的位置,这样第一轮比较基数后最大的数就到了最后面,接着进行第二趟的比较,比较到前面N-1个数,原理也是前面的那样,大的往后面不停的排,直到比较到前面只剩下一个数的时候,就完成了排序,这就是冒泡的原理: 下面用这个图代表一下伪代码,画一下流程,说实话,在学校学习的时候,我连这个图都不理解! 冒泡排序的代码: #include "stdio.h" #

用redis实现消息队列

为什么需要消息队列 系统中引入消息队列机制是对系统一个非常大的改善.例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中.你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样可能会因为网络的不确定性造成用户长时间的等待从而影响用户体验. 有些场景下是不可能使用同步方式等待完成的,那些需要后台花费大量时间的操作.例如极端例子,一个在线编译系统任务,后台编译完成需要30分钟.这种场景的设计不可能同步等待后在回馈,必须是先反馈用户随后异步处理完成,再等待处理完成后根据情况再此