Redis学习日记-05:SORT命令
目录
- 前言
- 命令&选项
- SORT(默认根据元素由小到大):
- DESC(逆序):
- ALPHA(非数字元素排序):
- BY(参考键):
- LIMIT(返回指定范围的结果):
- GET(指定排序之后的返回数据):
- STORE(将排序结果存入另一个键中)
- 总结
前言
在进行数据排序的时候很容易想到使用ZSET(有序集合)。然而有序集合常见的使用场景是大数据排序,如游戏玩家排行榜等,所以很少获取键中的全部数据。然而在Redis中对数据的排序除了用有序集合外还可以使用SORT命令。
SORT命令可以对列表、集合、有序集合类型的键进行排序。
命令&选项
以列表类型为例:
127.0.0.1:6379> lrange post 0 -1
1) "2"
2) "1"
3) "3"
SORT(默认根据元素由小到大):
127.0.0.1:6379> sort post
1) "1"
2) "2"
3) "3"
DESC(逆序):
127.0.0.1:6379> sort post desc
1) "3"
2) "2"
3) "1"
在SORT命令后面加上DESC选项即可将元素逆序排序
ALPHA(非数字元素排序):
127.0.0.1:6379> lrange strlist 0 -1
1) "d"
2) "B"
3) "C"
4) "b"
5) "A"
加上ALPHA选项(如果不加该选项会报错:(error) ERR One or more scores can't be converted into double)
127.0.0.1:6379> sort strlist alpha
1) "A"
2) "b"
3) "B"
4) "C"
5) "d"
该选项会按照字典顺序排序。
BY(参考键):
示例1
127.0.0.1:6379> hget post:1 count
"10"
127.0.0.1:6379> hget post:2 count
"15"
127.0.0.1:6379> hget post:3 count
"5"
127.0.0.1:6379> lrange post 0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379> sort post by post:*->count
1) "3"
2) "1"
3) "2"
==实例2(某个参考键不存在的情况)==:
127.0.0.1:6379> lrange post 0 -1
1) "4"
2) "2"
3) "1"
4) "3"
127.0.0.1:6379> hget post:4 count
(nil)
127.0.0.1:6379> sort post by post:*->count
1) "4"
2) "3"
3) "1"
4) "2"
- 该选项可以指定一个参考键(该参考键可以是字符串类型键或者散列类型键的某个字段)来进行排序,而不按照待排序键的元素大小排序。
如上所示,BY选项后面的参数“post:->count”,表示按照“post:”开头的散列的count字段排序,过程中会用待排序键的元素替换“”,即先分别取到post:2、post:1、post:3的count字段的值,分别为15、10、5,并按该值由小到大排序(5,10,15)->(post:3,post:1,post:2),最后返回对应的待排序中的元素(3,1,2)。- 如果参考键是一个常量键或者不存在的键,则SORT的结果和LRANGE的结果相同,没有执行排序操作。常量键指的是不包含“*”,如“post:1->count”。
- 如果参考键值相同,即如果上述post:1、post:2、post:3的count字段值相同,则SORT会按照待排序键元素本身来排序。
- 如果某个元素对应的参考键不存在,则默认参考键的值为0。如上示例2,post:4这个散列并不存在,但是post中元素中加入了4,则排序会按照由小到大(0(post:4默认),5,10,15)->(post:4,post:3,post:1,post:2),最后返回对应的待排序中的元素(4,3,1,2)。
LIMIT(返回指定范围的结果):
127.0.0.1:6379> lrange post 0 -1
1) "4"
2) "2"
3) "1"
4) "3"
127.0.0.1:6379> sort post limit 1 3
1) "2"
2) "3"
3) "4"
LIMIT选项后面可以跟两个参数,一个是offset,代表从那个位置开始;另一个是count,代表取多少个元素。和Mysql的LIMIT语法很像。
GET(指定排序之后的返回数据):
示例1
127.0.0.1:6379> sort post by post:*->count get post:*->time
1) (nil)
2) "423"
3) "123"
4) "234"
实例2
127.0.0.1:6379> sort post by post:*->count get post:*->time get #
1) (nil) ---post:*->time代表的值
2) "4" ---元素本身的值
3) "423"
4) "3"
5) "123"
6) "1"
7) "234"
8) "2"
- 实例1可以看到上面SORT命令后面跟了“get post:->time”,意思是该排序不返回待排序键元素本身,而是返回指定的以“post:”开头的散列类型键的time字段。
- 你也可以使用“get #”来使其返回待排序键元素本身,如上示例2,依次输出GET选项对应的值。
- SORT后面BY选项只能有一个,但是GET选项可以有多个。
STORE(将排序结果存入另一个键中)
针对上面GET命令示例2中的数据,再附加STORE选项:
127.0.0.1:6379> sort post by post:*->count get post:*->time get # store sort:result
(integer) 8
127.0.0.1:6379> type sort:result
list
127.0.0.1:6379> lrange sort:result 0 -1
1) ""
2) "4"
3) "423"
4) "3"
5) "123"
6) "1"
7) "234"
8) "2"
可以看到STORE选项后面跟了一个参数键sort:result,这个键可以是之前不存在的,命令执行后,会将排序返回的结果存放到该键中以列表的形式存在。
总结
SORT是Redis最强大的命令之一,如果使用不当会造成性能瓶颈。SORT的时间复杂度为O(n+mlog(m)),其中n表示待排序元素的数量,m表示返回的元素数量。当n很大时,Redis在排序前建立一个长度为n的容器来存储待排序元素,因此同时进行大数据量的排序不管是在时间还是空间上消耗很多,从而降低性能。
因此使用SORT命令时应该注意以下几点:
- 尽可能减少待排序键中的元素;
- 尽可能减少排序之后返回的数据,你可以使用上面提到的LIMIT选项来控制;
- 如果排序返回的结果较多,尽可能使用上面提到的STORE将排序结果缓存起来。
转载于:https://www.cnblogs.com/xuxiaojian/p/9559989.html
Redis学习日记-05:SORT命令相关推荐
- 【使用Redis分布式锁实现优惠券秒杀功能】-Redis学习笔记05
前言 本章节主要实现限时.限量优惠券秒杀功能,并利用分布式锁解决<超卖问题>.<一人一单问题>. 一.优惠券下单基本功能实现 1.功能介绍及流程图 2.代码实现 @Resour ...
- 我的Unity3D学习日记-05(官方实例2Droguelike)
快要一个月没有更新了,这段时间也没闲着.今天就把这段时间学到的东西稍微总结一下. 前段时间开始看一些实战开发的内容和教程.一些是来自于麦子学院的视频,一些来自于蛮牛教育,还有一部分官方教学视频.最终选 ...
- Redis学习与实战之字符串命令
字符串命令 一.基本字符串命令 1.基本字符串操作命令(设置.取值.删除.取长度) 命令名称 命令功能 执行时间复杂度 Set 为指定的一个键设置对应的值,如果已经存在,则直接覆盖原来的值 O(1) ...
- redis学习-列表(list)常用命令
redis学习-列表(list)常用命令 lpush:从列表左侧头部添加数据 rpush:从右侧尾部添加数据 lpop:从给左侧头部取出一个元素 rpop:从右侧尾部取出一个元素 lrange:取出指 ...
- Redis学习(5)-常用命令
Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用 1.键值相关命令 2.服务器相关命令 键值相关命令 Keys pattern 例如:k ...
- 学习一个 Linux 命令:sort 命令
今天来给大家介绍一下linux的sort命令 1.命令简介 以行为单位对文本文件的内容进行排序,将结果显示在标准输出,比较原则是从行首字符向后,依次按 ASCII 码值进行比较,最后按升序输出.如果 ...
- Redis 学习---(5)Redis 命令
Redis 命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语 ...
- Linux | Shell 学习笔记(二)Shell 流程控制 if、case、for、while| read读取输入 | 函数的使用 | cut、sed、awk、sort命令 +Demo
文章目录 参考资料 运行环境 一.流程控制 1.1 if 判断 1.2 case 语句 1.3 for 循环 1.4 while 循环 二. read 读取控制台输入 三.函数 3.1 系统函数 ba ...
- Redis学习、缓存、持久化、哨兵模式
个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 我写代码是为了更好的表达自我,这是艺术创作,而不单单是为了把事情搞定. -Antirez ...
最新文章
- 基础篇9-python基本数据结构-列表
- 【廖雪峰python入门笔记】for循环
- chrome开发者工具功能拾遗:Sources面板篇
- eclipse引入svn插件,并将项目同步到svn
- python画饼图-从零开始学Python--matplotlib(饼图)
- AntData.ORM框架 之 读写分离
- ME3630模块常用指令介绍
- Linux rpm软件包管理工具常用命令示例
- SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版
- 手把手教你写DI_0_DI是什么?
- 618期间, “直播带货”翻车负面信息暴增
- Go基础-Mac中Go环境的安装以及实现第一个go程序hello world
- IDEA中查找与替换快捷键(项目全局替换、该文件下替换)
- HTML音频视频、JS方法,以及插件使用教学
- 【原创】新韭菜日记31--一个韭菜的自我修养,学习什么是白马蓝筹
- 情人节快乐(转)十五首最美爱情古诗词,伴你过一个温馨浪漫的情人节
- 时尚回馈:店铺以帮助飓风桑迪赈灾基金
- 按键精灵抓取不到的问题
- js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
- 计算机硬盘 打开很慢,电脑硬盘运行速度慢如何解决 电脑硬盘运行速度慢解决方法【介绍】...