4.3排序

4.3.1有序集合的集合操作

有序集合没有zinter和zunion命令,使用其他命令实现方法:

multi
zinterstore tempKey ...
zrange tempKey ...
del tempKey
exec

4.3.2 sort命令

sort key [alpha] [asc|desc] [limit offset count]

sort命令可以对列表类型、集合类型和有序集合类型进行排序,并且完成与

关系数据库中连接查询相类似的任务

127.0.0.1:6379> lpush bar 1 23 6 98 999 55 6.3
7
127.0.0.1:6379> sort bar
1
6
6.3
23
55
98
999

在对有序集合类型排序会忽略元素的分组,只针对元素自身的值进行排序

127.0.0.1:6379> zadd baz 100 9 800 2 500 5 700 3 400 6
5
127.0.0.1:6379> sort baz
2
3
5
6
9
127.0.0.1:6379> zrange baz 0 -1
9
6
5
3
2

sort命令还可以通过alpha参数实现按照字典顺序排列非数字元素

127.0.0.1:6379> lpush quux book good look food wood tool
6
127.0.0.1:6379> sort quux alpha
book
food
good
look
tool
wood

sort命令的desc参数可以实现将元素按照从大到小排列(默认asc升序)

127.0.0.1:6379> sort quux alpha desc
wood
tool
look
good
food
book

sort命令limit offset count参数,表示跳过前offset个元素并获取之后

的count个元素.

127.0.0.1:6379> sort quux alpha asc limit 1 3
food
good
look

4.3.3 by参数

sort key ... by 参考键 [asc|desc]

参考键可以是字符串类型或则散列类型键的某个字段(键名->)

如果提供了by参数,sort命令将不再依据元素自身的值进行排序,

而是对每个元素使用元素的值替换参考键中第一个"*"并获取其值,

然后依据该值对元素排序.

字符串类型:

127.0.0.1:6379> lrange book 0 -1
Python
Tangshi
Sanguo
127.0.0.1:6379> get book:Python
price:36
127.0.0.1:6379> get book:Sanguo
price:48
127.0.0.1:6379> get book:Tangshi
price:28
127.0.0.1:6379> sort book by book:* alpha
Tangshi
Python
Sanguo

散列类型:

127.0.0.1:6379> hset bok:Python price 36
1
127.0.0.1:6379> hset bok:Tangshi price 28
1
127.0.0.1:6379> hset bok:Sanguo price 48
1
127.0.0.1:6379> sort book by bok:*->price
Tangshi
Python
Sanguo
  • 参考键的用来比较的值相同时,sort命令会再比较元素的大小来绝对二者顺序
  • 参考键虽然支持散列类型,但是 * 只能在 -> 前面.否则返回值是元素本身大小排序.

4.3.4 get参数

get参数不影响排序,它的作用是sort命令返回结果是get参数指定的键值.

get参数的规则和by参数一样,get参数也支持字符串和散列类型,并使用 * 作为占位符.

127.0.0.1:6379> hset bok:Sanguo name SanGuoYanYi
1
127.0.0.1:6379> hset bok:Tangshi name Tangshi300
1
127.0.0.1:6379> hset bok:Python name PythonStart
1
127.0.0.1:6379> sort book by bok:*->price get bok:*->name
Tangshi300
PythonStart
SanGuoYanYi

在一个sort命令可以有多个get参数(by参数只能一个).

127.0.0.1:6379> hset bok:Python ZX 人民邮电出版社
1
127.0.0.1:6379> hset bok:Tangshi ZX 商务印书馆
1
127.0.0.1:6379> hset bok:Sanguo ZX 人民文学出版社
1
127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX
Tangshi300
商务印书馆
PythonStart
人民邮电出版社
SanGuoYanYi
人民文学出版社
  • get # 会返回元素本身的值
127.0.0.1:6379> sort book by bok:*->price get # get bok:*->name get bok:*->ZX
Tangshi
Tangshi300
商务印书馆
Python
PythonStart
人民邮电出版社
Sanguo
SanGuoYanYi
人民文学出版社

4.3.5 store参数

默认情况下sort会直接返回排序结果,使用store参数会保存结果.

例如把结果存入book.view键

127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX store book.view
6
127.0.0.1:6379> lrange book.view 0 -1
Tangshi300
商务印书馆
PythonStart
人民邮电出版社
SanGuoYanYi
人民文学出版社

store参数常用来结合expire命令缓存排序结果,伪代码如下:

# 判断是否存在之前排序结果的缓存
$isCacheExists = EXISTS cache.sort
if $isCacheExists is 1
# 如果存在直接返回
return lrange chache.sort 0, -1
else
# 如果不存在,则使用sort排序
$sortResult = sort some.list store cache.sort
# 设置缓存的过期时间为10分组
expire cache.sort, 600
# 返回排序结果
return $sortResult

4.3.6性能优化

sort是redis最强大最复杂的命令之一.sortd命令时间复杂度为O(n+mlog(m)),

其中n表示排序的的列表(集合或有序集合)中元素个数,m表示要返回的元素 个数.

当n较大是sort命令性能相对较低.所以开发中使用sort命令应注意以下几点:

  1. 尽可能减少待排序键中元素的数量(使n尽可能少)
  2. 使用limit参数只获取需要的数据(使m尽可能少)
  3. 如果排序的数据量较大,尽可能使用store参数将结果缓存

Redis自学笔记:4.3进阶-排序的更多相关文章

  1. Redis自学笔记:4.1进阶-事务

    第4章:进阶 4.1事务 4.1.1概述 redis中的事务是一组命令的集合 事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行, 要么都不执行 事务的原理是先将一个事务的命令发送 ...

  2. Redis自学笔记:4.4进阶-消息通知

    4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...

  3. Redis自学笔记:4.2进阶-过期时间

    4.2过期时间 **4.2.1命令介绍* 在redis中使用 expire 命令设置一个键的过期时间后redis会自动删除它. expire key seconds (seconds单位是秒,必须是整 ...

  4. Redis自学笔记:5.实践

    第5章实践 5.3 python与redis 5.3.1安装 pip install redis 5.3.2使用方法 自己补充内容:Ubuntu下redis开启远程连接 打开redis配置:sudo ...

  5. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  6. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  7. Redis自学笔记–Zset类型及管理简述

    Zset类型                                                                                               ...

  8. python自学笔记(七)排序与多级排序

    一.sorted内置方法 a = [1,2,3,4] 从大到小(翻转) a = sorted(a,reverse = True) #生成新对象,不会原地修改,需要重新赋值 print a --> ...

  9. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

随机推荐

  1. 第八周学习总结-C#、C++

    2018年9月2日 今天是小学期开始第三天,本周前几天看了看C#和C++,用C#窗体做了个计算器,然后还用Scratch做了一个贪吃蛇的脚本. 31号小学期开始,到今天我把A类基本做完了.一开始做通讯 ...

  2. 充分认识Mysql

    使用开源产品是一种潮流.在使用之前,我们首先需要对Mysql 有一定的了解,特别是Mysql 的缺点.只有了解其缺点后,我们才知道,能不能真正的应用到我们的业务场景中去. 2.1 Mysql 数据库简 ...

  3. Python Day-1 练习

    作业1 要求:1.输入用户密码 2.认真成功后显示欢迎信息 3.输入三次锁定 代码如下: __author__ = 'zhang.ning' username = "zhangning&qu ...

  4. jQuery常见案例

    jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...

  5. Linux使用退格键时出现^H ^?解决方法

    Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...

  6. 最新版谷歌浏览器的Flash设置已经不能保存了?

    解决方法:先去chrome实验室界面chrome://flags/#enable-ephemeral-flash-permission选择取消Disabled.取消该实验室选项. 然后去chrome: ...

  7. FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable) java.io.FileNotFoundException: /tmp/kafka-logs/.lock (Permission denied)

    1.启动kafka的时候,报错如下所示: [-- ::,] INFO zookeeper state changed (SyncConnected) (org.I0Itec.zkclient.ZkCl ...

  8. OSGi HelloWorld

    1.创建项目 2.Debug Configurations,配好之后,可以点一下右下角的Validate Bundles验证一下是否有问题 3.Debug

  9. 搭建自己的docker仓库

    https://docs.docker.com/registry/deploying/#run-a-local-registry https://docs.docker.com/registry/in ...

  10. Storm——Android SQLite数据库管理类库

    Storm是一个Android SQLite数据库管理类库,可以通过注解创建表和迁移数据库.它不是ORM框架.   特性: 1.通过@Annotations创建表: 2.通过@Annotations迁 ...