redis排重_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进行排序。

示例: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 原理基本相同

注意:均使用快排。

升序时使用对比函数产生升序对比结果。

降序时使用对比函数产生降序对比结果。

4、BY选项

作用:SORT命令可以制定某些字符串键,或者某个哈希键所包含的某些域来作为元素的权重,对一个键进行排序。

默认情况下SORT命令使用被排序键所包含的元素作为排序的权重,元素本身决定了元素在排序后所处的位置。

示例:SORT BY

原理:以列表为例,目标列表fruits。

1)创建redisSortObject结构数组,长度与fruits长度相同。

2)遍历数组,将数组各项指针指向fruits列表中各个元素。

3)遍历数组,根据各个数组项指针所指的列表元素,以及BY选项所制定的模式(*-price),查找相应的权重键。

4)将各个权重键的值保存在数组浮点属性中。

5)根据数组各项权重值对数组进行排序。

6)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。

5、带ALPHA的BY选项

作用:单纯的BY选项默认假设权重键保存的值为数值。如果值为字符串,就需要ALPHA的配合。

示例:SORT BY ALPHA

原理:原理与BY选项基本相同。不同点在第五步,是对字符串还是数值进行排序。

6、LIMIT选项

作用:返回SORT命令排序后的结果集的一部分,类似一次分页查找。

示例:SORT alphabet ALPHA LIMIT 0 4 , SORT alphabet ALPHA LIMIT 2 4

原理:原理与其他SORT命令基本相同,不同点在于返回数据给客户端时按照LIMIT的两个参数(LIMIT )限制结果集大小。

7、GET选项

作用:SORT对键进行排序后,根据被排序的元素,以及GET选项所制定的模式,查找并返回某些键的值。

示例:SORT students ALPHA GET *-name(SORT OPTIONS GET )

原理:

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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值