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命令时应该注意以下几点:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1

错误大致显示如下信息:04-14 07:39:18.325: E/AudioEffect(20584): set(): AudioFlinger could not create effect, status: -104-14 07:39:18.325: E/libOpenSLES(20584): Effect initCheck() returned -104-14 07:39:18.325: E/libOpenSLES(20584): Environmental…

c语言mfc弹出窗口函数,CMFCDesktopAlertWnd实现桌面弹出消息框

1.创建一个CMFCDesktopAlertWnd指针CMFCDesktopAlertWnd* pPopup new CMFCDesktopAlertWnd;2.设置参数pPopup->SetAnimationType((CMFCPopupMenu::ANIMATION_TYPE) 2);pPopup->SetAnimationSpeed(100);pPopup->SetTransparency((BYTE)128);pPopup->SetSmallCaptio…

linux文件编程(2)——系统文件描述符、动静态文件、块设备介绍

参考:linux文件编程(2)——文件操作原理简述之文件描述符、动静态文件、块设备 作者:丶PURSUING 发布时间: 2021-04-09 11:14:12 网址:https://blog.csdn.net/weixin_44742824/article/details/115209312 目…

wxpython入门_wxpython笔记:Wxpython入门

#!/usr/bin/env python静态文本、可控文本、对话框、GetApp()importwx,timeID_EXIT200ID_ABOUT201class Frame(wx.Frame): #2 wx.Frame子类def __init__(self,parent None,id -1,title wxPython!):wx.Frame.__init__(self,parent,id,title,size(500,500))self.setupStatusBar…

C#常用加密方式

一、AES加密算法AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。 AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 1…

C语言写文件到txt里有屯字,C语言10 文件.ppt

第十章 文件C文件概述文件类型指针文件的打开与关闭文件的读写文件的定位出错的检测赂恰滔氢戳骏市蔫盒少郴害篆汤看拴掳驮泅戈呕压琐憨波褪队敛紫爸戏仅C语言10 文件C语言10 文件10.1 C文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位文件分类按…

java中volatile的使用方式

2019独角兽企业重金招聘Python工程师标准>>> 转载地址: http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 转载于:https://my.oschina.net/wangfree/blog/122664

python socketio_flask-socketio实现WebSocket的方法

【flask-socektio】之前不知道在哪个场合下提到过如何从web后台向前台推送消息。听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用。不过,反向ajax的代价也很明显,只要客户端还和服务端要有信息交互&#x…

linux文件编程(1)—— open、write、read、lseek、阻塞问题(ps文件操作/文件描述符/重定向原理/缓冲区/标准错误)

参考:linux文件编程(1)—— 常用API之open、write、read、lseek 作者:丶PURSUING 发布时间: 2021-04-08 22:19:28 网址:https://blog.csdn.net/weixin_44742824/article/details/115209134 【Linux】文件操…

最大流自用模板(例题:HDU1532)

三种模板:Edmonds_Karp,Dinic,SAP 例题: Drainage Ditches(HDU1532) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22365 Accepted Sub…

安卓手机python数据可视化_python 数据可视化

# -*- coding:utf-8 -*-# 异常值处理import pandas as pdaimport numpy as npyimport matplotlibmatplotlib.use(Agg)import matplotlib.pyplot as pylimport iodef index(data):# 输出结果必须为字典outputoutput {}# data pda.read_excel("D:/taobao2.xls")data …

$_SERVER

PHP $_SERVER 变量 $_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。它是 PHP 中一个超级全局变量,我们可以在 PHP 程序的任何地方直接访问它。 $_SERV…

linux文件编程(4)—— 用ANSIC标准C库函数进行文件编程:fopen、fread、fwrite、fseek

参考:linux文件编程(5)—— 用ANSIC标准中的C库函数进行文件编程 作者:丶PURSUING 发布时间: 2021-04-11 11:58:25 网址:https://blog.csdn.net/weixin_44742824/article/details/115209680 部分参照&#…

swig封装 c语言函数到python库,python swig 调用C/C++接口

转载:https://www.cnblogs.com/dda9/p/8612068.html当你觉得python慢的时候,当你的c/c代码难以用在python上的时候,你可能会注意这篇文章。swig是一个可以把c/c代码封装为python库的工具。(本文封装为python3的库)文章结构整体看封装只使用py…

Java学习---面试基础知识点总结

Java中sleep和wait的区别① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线…

python中的语言特性_python自测——语言特性

语言特性1.谈谈对 Python 和其他语言的区别答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。拿 C 语言和 Python 比&…

使用NPOI和委托做EXCEL导出

首先,在用NPOI导出时,学习了邀月这篇文章NPOI根据Excel模板生成原生的Excel文件实例,在这里先行谢过了。 本篇文章在邀月的基本上,做了一些小的改动,加上委托的机制。因为在做导出时,加载模板,下…

全国计算机等级考试题库二级C操作题100套(第63套)

第63套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;有NN矩阵&#xff0c;根据给定的m&#xff08;m<N&#xff09;值&#xff0c;将每行元素中的值均右移m个位置&#xff0c;左边置为0。例如&#xff0c;N3&#xff0c;m2&#xff0c;有下列矩阵 1 2 3…

android 放大镜功能,简单实现Android放大镜效果

利用之前学过的图形图像绘画技术和图片添加特效技术&#xff0c;我们来实现一个Android放大镜的简单应用。最终效果如图具体实现:用来显示自定义的绘图类的布局文件res/layout/main.xml:xmlns:tools"http://schemas.android.com/tools"android:layout_width"fil…

python直方图拟合曲线_在直方图python中拟合非标准化高斯

我有一个暗图像(原始格式)&#xff0c;并绘制图像的图像和分布 . 正如您所看到的那样&#xff0c;在16处有一个高峰&#xff0c;请忽略它 . 我想通过这个直方图拟合高斯曲线 . 我已经使用这种方法来适应&#xff1a;Un-normalized Gaussian curve on histogram . 然而;我的高斯…