目录

  • 前言
  • 命令&选项
    • 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命令时应该注意以下几点:

  1. 尽可能减少待排序键中的元素;
  2. 尽可能减少排序之后返回的数据,你可以使用上面提到的LIMIT选项来控制;
  3. 如果排序返回的结果较多,尽可能使用上面提到的STORE将排序结果缓存起来。

转载于:https://www.cnblogs.com/xuxiaojian/p/9559989.html

Redis学习日记-05:SORT命令相关推荐

  1. 【使用Redis分布式锁实现优惠券秒杀功能】-Redis学习笔记05

    前言 本章节主要实现限时.限量优惠券秒杀功能,并利用分布式锁解决<超卖问题>.<一人一单问题>. 一.优惠券下单基本功能实现 1.功能介绍及流程图 2.代码实现 @Resour ...

  2. 我的Unity3D学习日记-05(官方实例2Droguelike)

    快要一个月没有更新了,这段时间也没闲着.今天就把这段时间学到的东西稍微总结一下. 前段时间开始看一些实战开发的内容和教程.一些是来自于麦子学院的视频,一些来自于蛮牛教育,还有一部分官方教学视频.最终选 ...

  3. Redis学习与实战之字符串命令

    字符串命令 一.基本字符串命令 1.基本字符串操作命令(设置.取值.删除.取长度) 命令名称 命令功能 执行时间复杂度 Set 为指定的一个键设置对应的值,如果已经存在,则直接覆盖原来的值 O(1) ...

  4. redis学习-列表(list)常用命令

    redis学习-列表(list)常用命令 lpush:从列表左侧头部添加数据 rpush:从右侧尾部添加数据 lpop:从给左侧头部取出一个元素 rpop:从右侧尾部取出一个元素 lrange:取出指 ...

  5. Redis学习(5)-常用命令

    Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用 1.键值相关命令 2.服务器相关命令 键值相关命令 Keys pattern 例如:k ...

  6. 学习一个 Linux 命令:sort 命令

    今天来给大家介绍一下linux的sort命令 1.命令简介 以行为单位对文本文件的内容进行排序,将结果显示在标准输出,比较原则是从行首字符向后,依次按 ASCII 码值进行比较,最后按升序输出.如果 ...

  7. Redis 学习---(5)Redis 命令

    Redis 命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语 ...

  8. 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 ...

  9. Redis学习、缓存、持久化、哨兵模式

    个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 我写代码是为了更好的表达自我,这是艺术创作,而不单单是为了把事情搞定. -Antirez ...

最新文章

  1. 基础篇9-python基本数据结构-列表
  2. 【廖雪峰python入门笔记】for循环
  3. chrome开发者工具功能拾遗:Sources面板篇
  4. eclipse引入svn插件,并将项目同步到svn
  5. python画饼图-从零开始学Python--matplotlib(饼图)
  6. AntData.ORM框架 之 读写分离
  7. ME3630模块常用指令介绍
  8. Linux rpm软件包管理工具常用命令示例
  9. SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版
  10. 手把手教你写DI_0_DI是什么?
  11. 618期间, “直播带货”翻车负面信息暴增
  12. Go基础-Mac中Go环境的安装以及实现第一个go程序hello world
  13. IDEA中查找与替换快捷键(项目全局替换、该文件下替换)
  14. HTML音频视频、JS方法,以及插件使用教学
  15. 【原创】新韭菜日记31--一个韭菜的自我修养,学习什么是白马蓝筹
  16. 情人节快乐(转)十五首最美爱情古诗词,伴你过一个温馨浪漫的情人节
  17. 时尚回馈:店铺以帮助飓风桑迪赈灾基金
  18. 按键精灵抓取不到的问题
  19. js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
  20. 计算机硬盘 打开很慢,电脑硬盘运行速度慢如何解决 电脑硬盘运行速度慢解决方法【介绍】...

热门文章

  1. 句子中单词首字母大写转换
  2. hdu 2531 Catch him
  3. css --- flex:n的解析
  4. 水瓶与天蝎的八年爱恋(图
  5. 《JavaScript 高级程序设计》精读笔记
  6. React Native通信机制详解
  7. Programming C#.Classes and Objects.只读字段
  8. 微软私有云分享(R2)22 计算机配置文件与基础设置
  9. 中南月赛 1313: ZZY的宠物
  10. mysql升级5.5