Redis - 排序
SORT 命令格式
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
基本用法
SORT 命令可以对列表类型、集合类型和有序集合类型键进行排序。
对列表排序:
127.0.0.1:6379> LPUSH list 2 0 1 6
(integer) 4
127.0.0.1:6379> SORT list
1) "0"
2) "1"
3) "2"
4) "6"
对集合排序:
127.0.0.1:6379> SADD set 4 3 9 9
(integer) 3
127.0.0.1:6379> SORT set
1) "3"
2) "4"
3) "9"
对有序集合排序(在对有序集合排序时会忽略元素的分数):
127.0.0.1:6379> ZADD sorted_set 50 2 40 3 20 1 60 5
(integer) 4
127.0.0.1:6379> SORT sorted_set
1) "1"
2) "2"
3) "3"
4) "5"
ALPHA 参数
通过 ALPHA 参数实现按照字段顺序排序非数字元素。
127.0.0.1:6379> RPUSH list r e d i s
(integer) 5
127.0.0.1:6379> SORT list
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> SORT list ALPHA
1) "d"
2) "e"
3) "i"
4) "r"
5) "s"
从上面的示例看,如果没有加 ALPHA 参数,SORT 命令会尝试将所有元素转换成双精度浮点数来比较,如果无法转换则会提示错误。
DESC 参数
DESC 参数可以实现将元素按照从大到小的顺序排序。
127.0.0.1:6379> LPUSH list 2 0 1 6
(integer) 4
127.0.0.1:6379> SORT list DESC
1) "6"
2) "2"
3) "1"
4) "0"
LIMIT 参数
SORT 命令还支持 LIMIT 参数来返回指定范围的结果。用户和 SQL 的语句一样,LIMIT offset count,表示跳过前 offset 个元素并获取之后的 count 个元素。
127.0.0.1:6379> LPUSH list 2 0 1 6
(integer) 4
127.0.0.1:6379> SORT list DESC LIMIT 1 2
1) "2"
2) "1"
BY 参数
很多情况下列表(或集合、有序集合)中存储的元素是对象的 ID,单纯对这些 ID 排序有时意义并不大。更多的时候我们需要根据 ID 对应的对象的某个属性进行排序。比如要以商品的价格为依据对商品进行排序,则需要使用 SORT 命令的 BY 参数。BY 参数的语法为 BY pattern,pattern 可以是字符串类型键或者是散列类型键的某个字段。如果提供了 BY 参数,SORT 命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换 pattern 中的第一个 * 并获取其值,然后依据该值排序。
127.0.0.1:6379> HMSET item:1 name iphone6 price 5999
OK
127.0.0.1:6379> HMSET item:2 name ipad price 2888
OK
127.0.0.1:6379> HMSET item:3 name applewatch price 8688
OK
127.0.0.1:6379> SADD item:ids 1 2 3
(integer) 3
127.0.0.1:6379> SORT item:ids BY item:*->price
1) "2"
2) "1"
3) "3"
当 pattern 不包含 "*" 时,即常量键名,SORT 命令将不会执行排序操作,因为 Redis 认为这种情况是没有意义的。
当某个元素的 pattern 不存在时,会默认 pattern 的值为 0,如:
127.0.0.1:6379> HSET item:4 name mac
(integer) 1
127.0.0.1:6379> SADD item:ids 4
(integer) 1
127.0.0.1:6379> SORT item:ids BY item:*->price
1) "4"
2) "2"
3) "1"
4) "3"
GET 参数
GET 参数不影响排序,它的作用是使 SORT 命令的返回结果不再是元素自身的值,而是 GET 中指定的键值。
127.0.0.1:6379> HMSET item:1 name iphone6 price 5999
OK
127.0.0.1:6379> HMSET item:2 name ipad price 2888
OK
127.0.0.1:6379> HMSET item:3 name applewatch price 8688
OK
127.0.0.1:6379> SADD item:ids 1 2 3
(integer) 3
127.0.0.1:6379> SORT item:ids BY item:*->price GET item:*->name
1) "ipad"
2) "iphone6"
3) "applewatch"
可以使用 GET # 返回商品的 ID:
127.0.0.1:6379> SORT item:ids BY item:*->price GET # GET item:*->name
1) "2"
2) "ipad"
3) "1"
4) "iphone6"
5) "3"
6) "applewatch"
STORE 参数
如果希望保存排序结果,可以使用 STORE 参数。
127.0.0.1:6379> SORT item:ids BY item:*->price GET # GET item:*->name STORE sorted_items
(integer) 6
127.0.0.1:6379> LRANGE sorted_items 0 -1
1) "2"
2) "ipad"
3) "1"
4) "iphone6"
5) "3"
6) "applewatch"
STORE 参数常用来结合 EXPIRE 命令缓存排序结果。
性能优化
SORT 命令的时间复杂度是 O(N+M*log(M)),其实 N 表示要排序的列表(集合或有序集合)中的元素个数,M 表示要返回的元素个数。
开发过程中应注意以下几点以提高性能:
- 尽可能减少带排序键中的数量(使 N 尽可能小)。
- 使用 LIMIT 参数只获取需要的数据(使 M 尽可能小)。
- 如果要排序的数据数量较大,尽可能使用 STORE 参数将结果缓存。
Redis - 排序的更多相关文章
- 三.redis 排序
本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT ...
- laravel操作Redis排序/删除/列表/随机/Hash/集合等方法全解
Song • 3563 次浏览 • 0 个回复 • 2017年10月简介 Redis模块负责与Redis数据库交互,并提供Redis的相关API支持: Redis模块提供redis与redis.con ...
- redis排序
1.sort 排序最常见的是sort命令,可以对列表或者有序集合排序,最简单的排序方式如下: > lpush list (integer) > lpush list (integer) & ...
- redis的sort排序
Redis排序命令是sort,完整的命令格式如下:SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] ...
- 【转载】Redis sort 排序命令详解
转载地址:http://www.jb51.net/article/69131.htm 本文介绍redis排序命令 redis支持对list,set,sorted set元素的排序 sort 排序命令格 ...
- 解决Redis Cluster模式下的排序问题
通常的redis排序我们可以这么做: 比如按商品价格排序:sort goods_id_set by p_*_price 这样在非集群模式下是没问题的,但如果在集群模式下,就会报错: 说是在集群模式下不 ...
- Redis简介 Linux安装Redis Redis使用
其他一些操作(包括 APPEND.GETRANGE.MSET 和 STRLENGTH 也可用于字符串.请参见http://doc.redisfans.com/string/index.html ) 使 ...
- Java连接Redis之redis的增删改查
一.新建一个maven工程,工程可以以jar的形式或war都行,然后导入正确的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0& ...
- Redis常用数据类型及使用场景
Redis最为常用的数据类型 字符串(String) 字符串列表(list) 字符串集合(set) 哈希(hash) 有序的字符串集合(sorted set) String(字符串) 字符串是最基本的 ...
随机推荐
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- HDU 5441 Travel (并查集+数学+计数)
题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...
- C++ API设计
<C++ API设计> 基本信息 作者: (美)Martin Reddy 译者: 刘晓娜 臧秀涛 林健 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:97871153 ...
- 简谈HTML5与APP技术应用
HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...
- iOS 中的UIWindow
使用Xcode新建一个工程后,Xcode会自动新建一些文件,其中有AppDelegate.h,AppDelegate.m,ViewController.h,ViewController.m,Main. ...
- java线程中的wait和notify以及notifyall
一.区别与联系 1.1.wait(),notify()和notifyAll()都是java.lang.Object的方法,而确实sleep方法是Thread类中的方法,这是为什么呢? 因为wait和 ...
- Linux下安装、启动MySQL
启动与停止 1.启动 MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可. [root@localhost mysql]# /etc/init.d/my ...
- strutx.xml中配置文件的讲解
Struts2框架的核心就是struts.xml文件了,该文件主要负责管理Struts的2的业务控制组件的核心内容.为了避免struts.xml的文件国 语庞大和臃肿,我们可以通过把一个struts. ...
- 发现一个不错的十六进制编辑器-HxD
十六进制编辑器我觉得是个必需的工具,遥想当年用文曲星的时候,Pacmanager.Ewayeditor…… 之前都在用WinHex,好用,但是是个收费软件,老用着破解版心里还是不舒服 后来发现这个名叫 ...
- Html页中使用OCX控件
原文:http://blog.csdn.net/mouse8166/article/details/5515657 最近准备开发一个b/s架构的应用程序需要用到activeX控件,web服务器尚未进入 ...